“Artı” ve “Eksi” uygun yöntem adları mıdır?


21

Java SE 8 tarihlerini, tanıştırmak için yeni bir mekanizma ile gelir LocalDate, LocalTimeve LocalDateTimezamanın anlarının temsil etmek sınıflar. : Böyle anları işlemek için yöntemler bütünüdür verilir LocalDate.plusDays(...), LocalDate.minusDays(...)böylece ve.

Her zaman iyi uygulamanın, amaçlarını tanımlayan fiillerden sonra yöntemleri isimlendirmek olduğunu düşündüm, çünkü yöntemler, aslında yapılacak işlemler, bir eylem gerçekleştirecek bir şey. Eğer böyle sınıfları dikkate duyarsanız, sadece söz StringBuilderörneğin, yöntemlerinin isimler append, insert, delete...

Bu benim için bir yöntem adlandırma doğru gelmiyor neden plusDaysyerine sumDays, minusDaysyerine subtractDays. Sadece benim çok sinir bozucu buluyorum? Ne düşünüyorsun?

Düşünebilmemin tek nedeni, tarihlerin değişmez nesneler olmasıdır, bu nedenle çağırdığınızda plusDaysorijinal nesneye günler eklemiyor, yeni özelliklerle yeni bir tane yaratıyorsunuz, ama bu çok ince.


22
Sanırım buna teknik olarak bakıyorsun. Metot isimlerinin asıl amacı ne yaptığını netleştirmek ve okunabilir hale getirmektir. Sadece onları fiillerle adlandırmanın normalde bu iki amacı gerçekleştirdiği ortaya çıktı . Ancak, sqrtkarekökü alan bir yöntem düşünün . Bu yöntemi takeSqrtadlandırmak kuralınıza göre mantıklı görünebilir, ancak bunu adlandırmak yöntemi daha okunaklı hale getirmez ya da netleştirmez.
Brandin

2
Programlama "İngilizce" değildir. Örneğin, sqrtprogramcıların tanımaları ve bilmeleri beklenen bir kelimedir. Bu arada İngilizce kelime "karekök" tir. Ancak, şeyleri İngilizce'de doğal olana göre adlandırmak iyi değildir. Örneğin, "yasadışı" kelimesini mükemmel bir şekilde ingilizce kelime olarak alın. Bununla birlikte, eğer biri kendi yöntemini seçerse isIllicit, bu yöntem çağrısına her baktığımda gözlerimi yırtmak isteyeceğimi düşünüyorum. Sadece korkunç görünüyor ve fikri ifade etmenin daha iyi bir yolu olmalı.
Brandin

18
sumbu bağlamda yanlış geliyor. Net'i tercih ederim AddDays.
CodesInChaos

3
@ LuigiCortese Yöntem adları, genel İngilizce kelime sıralamasıyla eşleşecek şekilde seçilir. Math.addExact(1, 2)çünkü "1 ve 2 ekle" diyorsun. tomorrow.plusDays(2)çünkü "yarın artı 2 gün" diyorsun. Bir şekilde addExactüye Integerolsaydı, olurdu 1.plusExact(2).
Tavian Barnes

8
Şahsen, plusDaysyeni bir tarih x gün sayısını geleceğe döndürmek addDaysbeklenirken, orijinal nesneyi değiştirmeyi bekleyebilirim. Bu sadece benim olsa, Java ile aşina olan ben değilim.
Ajedi32

Yanıtlar:


52

Düşünebilmemin tek nedeni, tarihlerin değişmez nesneler olmasıdır, bu nedenle plusDays işlevini çağırdığınızda, orijinal nesneye gün eklemezsiniz, ancak yeni özelliklerle yeni bir tane yaratırsınız, ancak bu çok değişkendir.

Bu tam olarak sebep. Zamanlama amacıyla tarih aralıklarını değiştirmek için bir tür api yediğinizi hayal edin. Aşağıdaki gibi bir ifade vermenize izin veren yöntemler gösterebilir:

var workdaySchedule = initialSchedule.withoutWeekends();

Bu, İngilizce ifadesine çok benzer bir şekilde okuyor: "İş günü takvimi, hafta sonları olmayan ilk takvimdir". İlk programın değiştirilmesi anlamına gelmez , çalışma programının farklı ve yeni bir şey olduğu anlamına gelir.

Şimdi bunun yerine ismini düşünün:

var workdaySchedule = initialSchedule.removeWeekends();

Bu kafa karıştırıcı. İlk program değiştiriliyor mu? Biz konum gibi geliyor çünkü kesinlikle öyle gibi çıkarmadan ondan hafta sonları. Öyleyse neden yeni bir değişkene atayız? Bu iki adlandırma şeması birbirine çok benzese de, bu olanları daha az açık bir şekilde andırıyor. Bu daha uygun olur removeWeekends did ilk zamanlamasını değiştirmek ve bu durumda void- döndü withoutWeekendskafa karıştırıcı seçenek olacaktır.


Bu, esasen bir bildirimsel ve zorunlu ayrımdır. Bunun belirli bir şey olduğunu mu ilan ediyor muyuz workdaySchedule, yoksa belirli bir şeyi yapmak için zorunlu talimatların ("kaldır" gibi) bir listesini mi uyguluyoruz? Genellikle, emirsel adlandırma, değerleri değiştirdiğiniz zaman daha mantıklıdır ve bildirim, yukarıdaki örnekte gösterildiği gibi, değişken değerlerle daha anlamlı hale gelir.

Senin durumunda, tamamen aynı şey var. Görsem: bunun mutasyona uğradığını tomorrow.plusDayshayal bile edemezdim tomorrow, oysa ki tomorrow.addDaysolabileceğini düşünürdüm. Bu biraz ince - ama mutlaka kötü bir şekilde değil. Çok fazla düşünmek zorunda kalmadan, bu adlandırma doğal olarak mutasyona girip girmediğiniz konusunda düşüncelerinizi doğru çizgiler boyunca belirler. Bu zorunlu ve bildirimsel stiller arasındaki bu ayrımı daha açık hale getirmek için: "add" (ve "remove") fiiller , "plus" (ve "without") edatlardır .


13
Aslında dün addDayskarşısında bir sorunum vardı plusDays! NET'te, DateTimesınıf denilen yöntemleri vardır addDays, addMonthsve addYears. Göreceli bir tarihi (1 yıl, 2 ay, 3 gün önce) ayrıştırmak için bir yöntem oluşturdum ve mevcut DateTimenesneyi değiştirdiklerini düşünerek yukarıda belirtilen yöntemleri çağırdım . Veritabanındaki her tarih 8 Haziran 2015'te sona erdi. "Bu komik" diye düşündüm. Ben hatırladım zamandı addDaysdeğiştirmez DateTimenesne, bir döner yeni bir tane. Yani bu soru için + 1 her yerde.
Greg Burghardt,

1
@GregBurghardt Bir .NET kullanıcısı olarak, tam tersi beklentilerim var. Sanırım bu sadece "artı" ve "add" ifadelerinin değiştirilebileceği, doğrudan eşleme ++=
yapamayacağı

2
@Agent_L Bu ilginç. .NET kuralları bir yana, "add" ve "plus", İngilizce olarak değiştirilemez.
Ben Aaronson

1
Ayrıca tarihler ve saatler için, D + 1, H + 12 ve benzerlerinden söz etmek, belirli bir orijinale göre referans zamanı (aynı zamanda, T-10, T-9, vb. Uzay uçuşları için) için de yaygındır. Genellikle, bu D-artı-1, H-artı-12, T-eksi-10 olarak okunur. Belki ABD merkezli, ama bana öyle geliyor.
Kristian H,

4
Jon Skeet'in bu eski StackOverflow sorusunu ilginç bulabilirsiniz: Değişmez bir koleksiyondaki mutasyona uğramamış bir "add" yönteminin en iyi adı nedir? .
MicSim

2

.NET'te sonuç tamamen aynı olmasına rağmen adlandırma farklıdır. Yerine:

tomorrow = LocalDateTime.plusDays(1);

var:

tomorrow = DateTime.Now.AddDays(1);

Bu sadece "artı" ve "ekleme" arasındaki farkların kişisel görüş olarak ortaya çıktığı anlamına gelir. Neşelen, yalnız değilsin, en azından sana daha çok hitap eden dili seçebilirsin:)


-1

Bu muhtemelen .Method, nesneyi değiştiren ve olmayanları, tüm yöntemler için kullanan bir Java eseridir .

Bir dil düşünün da bir sahiptir object=>methodverecekti sözdizimi, methodüzerinde çalışmak için nesnenin bir kopyasını. Şimdi böyle bir dilde startDate=>plusDays(5)açıkça belirsiz. Orijinal tarihi alır ve 5 gün sonra yeni bir tarih oluşturur.

İlgisiz bir notta, sumDaysburada bir anlam ifade etmiyor. LocalDateBir süredir noktası değil, bir zaman süresi . İstediğiniz sayıda süreyi toplayabilirsiniz (ve sonuç başka bir süredir) ve bir zaman noktası ve süre ekleyebilirsiniz (sonuç başka bir zaman noktasıdır), ancak zaman noktalarını toplamazsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.