“Get” ve “find” önekleriyle adlandırma yöntemleri arasında nasıl ve neden karar vermelisiniz?


48

getSomethingVersus ile başlayan belli bir yöntemi isimlendirmem gerekip gerekmediğini anlamakta her zaman sorun yaşarım findSomething.

Sorun , iyi tasarlanmamış API'ler için yardımcıların oluşturulmasında yatmaktadır . Bu genellikle, nesneyi parametre olarak gerektiren bir nesneden veri alınırken oluşur. İşte basit bir örnek:

public String getRevision(Item item) {
    service.load(item, "revision");
    // there is usually more work to do before getting the data..
    try {
        return item.get_revision();
    }
    catch(NotLoadedException exception) {
        log.error("Property named 'property_name' was not loaded", exception);
    }
    return null;
}

Bu yöntemi getRevision()veya olarak adlandırmak arasında nasıl ve neden karar vermelisiniz findRevision()?


2
Kötü tasarlanmış bir API için en iyi yardımcı , zor isimlendirmeyle karıştırmak değil, bir Yolsuzlukla Mücadele Katmanı oluşturmaktır : "Uygulamanızın, bir veritabanını veya kendi uygulamanızın içinde istediğiniz modele uygun olmayan başka bir uygulamayı ele alması gerekiyorsa, Bu modele ve sizin dilinize çevirmek için bir AnticorruptionLayer kullanın. "
tatarcık

1
Bu kavramı daha önce hiç duymamıştım. Örneklerle daha iyi bağlantılarınız var mı?
11'de bilinen

1
Web’de arama yapın, epeyce bilgi var. Örneğin, Yolsuzlukla Mücadele Katmanının Anatomisi, Bölüm 1 "muhtemelen ... kaçınılmaz olarak, orada bulunan spagetti ile etkileşime girme göreviyle karşı karşıya kalmanız muhtemeldir." Yolsuzlukla Mücadele Katmanına Giriniz ... "
gnat

Yanıtlar:


83

GetAlma süresinin çok kısa olacağını bildiğimde kullanıyorum (karma tablodan veya btree'den bir aramada olduğu gibi).

Find"uzun" bir keyfi değer için) yürütülmesi için "daha uzun" bir süre gerektiren bir arama işlemi veya hesaplama algoritması anlamına gelir .


3
+1 Alma sırasında get'i kullanıyorum ve alma işlemi için yapılması gerekenleri buluyorum.
Jim

5
Kod değişikliklerinin (bazı kısımların optimize edildiğini ve algoritmaların değiştiğini) ve API'yi değiştirmenin hesaba katılması genellikle doğru bir kriter gibi görünmediğini imkansız hale getirir. findSonradan bir tablo tablosu algoritmasıyla değiştirirseniz ne yapardınız ?
meze

2
Ayrıca, bir arama okurken, arama kriterinin başarılı olmadığı için “arama” nın çağrılabileceğini, çünkü “alış” ın alışılmadık bir problem olmadıkça, “alma” nın başarılı olmasını beklediğini de varsayardım.
gnasher729

İşlev bazı koşullara göre sonuçları filtrelemek için isteğe bağlı bir parametre kabul ederse ne olur? Her ikisi de getve findnasıl kullanıldığına bağlı olarak uygulanır.
ESR,

61

Bunun findbaşarısız olabileceğini söyleyebilirim ama getolmamalıyım.


25
Eğer findNULL döndürürken, NULL getdöndürmez, ancak atıp (veya küfredebilir) demek istiyorsan , kabul ediyorum.
Sjoerd

1
Bu konuda @Sjoerd ile tamamen katılıyorum.
saat

Ya find()geri dönüşler Optional<>? Bu durumda findda nullgüvenlidir.
TheCoder

42

Çocuklarımla sık sık yaptığım bir konuşmayı alıntılamak için:

ben: Hey evlat! Git bana biraz pil bul

kid: Peki neredeler?

ben: Bu yüzden sana gidip onları bulmanı söyledim. Nerede olduklarını bilseydim, gitmeni söyledim olurdu olsun onları. Ya da annene sorabilirsin.

Aynı fikir:

  • ucuza elde edilebilir bir bilgi parçası döndüren bir yöntem için (ve büyük olasılıkla inline edilmiş veya başka şekilde optimize edilmiş olabilir) veya bu nesneye ait olmayan bir bilgi parçası için "get" kullanın.

  • bilgi bulmak için işe yarayan bir yöntem için "bul" u kullanın veya bulmak için başka nesneler kullanın.


16
Sadece bir programcı bu sohbeti çocuklarıyla yapabilirdi. “Çöpü çıkarmak istiyor musun?” "Hayır." "Çöpü dışarı çıkarır mısın?" "Evet."
Robert Harvey,

@RobertHarvey Sanırım insanlarla bu sorunu yaşıyorum. Ne zaman birileri bir şeyi açıklamaya çalışırsa veya bir soru sorsa, genellikle geri soruları sorup onlara bu konuda açık olmalarını söylerim. Aksi takdirde, genellikle bir XY problemi ile sonuçlanır. Bunu yapmazsam, yürüyen otomatik tamamlama özelliği gibi hissediyorum. Aklında ne olduğunu bilmiyorsun, kelimelerin içine koyamazsın, çift sözler söylersin ve senin için tüm "düşünmeyi" beklememi ve sana yardım etmemi mi beklersin? Hayır, olmaz :)
akinuri

3

Bulma, aramalar arasında değişebilecek bazı parametrelerle bir veritabanı sorgusu çalıştırırken olduğu gibi sonucun bulunmadığı anlamına gelir. Öte yandan, Get, sonuçların önceden yöntem tarafından bilindiğini ya da bir kez bilinmediğinde, çağrıda hiçbir parametre olmadığı anlamına gelir.
Bu nedenle, örneğin Müşteri findCustomerById (uzun customerId) ve Customer getCustomer () kullanırdım


3

Aşağıdaki modeli uyguladım:

  • Foo GetFoo() null döndüremez ve karmaşıklığı O (log (n)) veya daha azdır
  • bool TryGetFoo(out Foo) null değerini döndürebilir ve karmaşıklığı O (log (n)) veya daha azdır.
  • Foo FindFoo() null döndüremez ve karmaşıklığı O'dan büyüktür (log (n))
  • bool TryFindFoo(out Foo) null değerini döndürebilir ve karmaşıklığı O değerinden fazladır (log (n))

Bu şekilde kod niyet ve beklediğiniz karmaşıklık konusunda oldukça açık.

Genellikle, Getters doğrudan liste veya sözlük / set erişimi içindir.
Bulucular derin arama, listenin tam taraması vb.

Senin durumunda:

public bool TryGetRevision( Item item, out String revision ) 
{
    service.load( item, "revision" );
    // there is usually more work to do before getting the data..
    try 
    {
        revision = item.get_revision();
        return true;
    }
    catch( NotLoadedException exception )
    {
        log.error( "Property named 'property_name' was not loaded", exception );
        revision = "";
        return false;
    }
}

+1 try, kısa ve kesin
SpaceTrucker

2

getHer durumda uygundur _ aslında, bir şeyi almak için önce onu bulmanız gerekeceği varsayılır. Bu yüzden emin değilseniz kullanın get.

Ben kullanırım findgibi yöntemler için findMinimum()veya findOptimal()dönüş değerini hesaplar ve sadece bazı verileri almak için DB, dosya sistemi, uzak sunucu, vb bir istek yapmaz bazı özel algoritma olduğu yerde yani.


1
Güzel nokta. Şahsen find, verdiğiniz örneklerde muhtemelen önek olarak kullanmam . Hesaplamalı görevler için, örneğinizdekiler gibi, calculateya da kullanırdım compute.
13'te


1

Genellikle Getbir nesneyi / değeri Findalmak ve konumunu (örneğin bir dizide) almak için kullanacağım .

örneğin:

object o = obj.GetItem( 'name');

integer i = somearray.Find( 'name');

0

Bana göre, findbirden fazla sonucun mevcut olabileceği anlamına gelir. getsadece birini ifade eder.


8
Görünüşe göre bu hissi var ama tamamen aynı fikirdeyim. Şöyle düşünün: getCatvs findCatvs getCatsvs findCats. find..Yine tek nesnelerin döndürülen temsil eder. Bence çoğul, isme eklenmelidir.
13'te
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.