“Yo-yo probleminden kaçın”, “ilkel takıntıya” izin vermek için geçerli bir neden midir?


42

İlkel saplantı ne zamana göre kod kokusu değil midir? , Bir String nesnesi yerine bir posta kodunu temsil etmek için bir ZipCode nesnesi oluşturmalıyım.

Ancak deneyimlerime göre görmeyi tercih ederim

public class Address{
    public String zipCode;
}

onun yerine

public class Address{
    public ZipCode zipCode;
}

çünkü sonuncusunun benden programı anlamak için ZipCode sınıfına gitmemi gerektirdiğini düşünüyorum.

Ve her ilkel veri alanlarının bir yo-yo probleminden (bir anti-patern) muzdarip gibi hissettirdiği bir sınıfla değiştirilip değiştirilmediğini tanımlamak için birçok sınıf arasında geçiş yapmam gerektiğine inanıyorum .

Bu yüzden, ZipCode yöntemlerini yeni bir sınıfa taşımak istiyorum, örneğin:

Eski:

public class ZipCode{
    public boolean validate(String zipCode){
    }
}

Yeni:

public class ZipCodeHelper{
    public static boolean validate(String zipCode){
    }
}

bu yüzden sadece posta kodunu doğrulaması gereken kişi ZipCodeHelper sınıfına bağlı olacaktır. Ve ilkel saplantıyı korumanın başka bir "yararını" buldum: sınıfın, varsa serileştirilmiş hali gibi görünmesini sağlar: dize sütunu zipCode ile bir adres tablosu.

Sorum şu, "yo-yo probleminden kaçınmak" (sınıf tanımları arasında hareket etmek), "ilkel takıntıya" izin vermek için geçerli bir neden mi?


9
@ jpmc26 O zaman bizim posta kodu nesnesinin ne kadar karmaşık olduğunu görünce şoke olurdunuz - doğru değil, ama var
Jared Goguen

9
@ jpmc26, "karmaşık" durumdan "kötü tasarlanmış" ortamlara nasıl ulaştığınızı göremiyorum. Karmaşık kod genellikle, varolan dilediğimiz ideal dünyadan ziyade gerçek kodun karmaşıklığı ile temasa geçen basit kodun sonucudur. “İki sayfa işlevine geri dönelim. Evet, biliyorum, sadece bir pencereyi görüntülemek basit bir işlev, ancak üzerinde küçük kıllar ve bazı şeyler büyüdü ve kimse nedenini bilmiyor. Peki, nedenini söyleyeceğim: bunlar böcek düzeltmeleri."
Kyralessa

18
@ jpmc26 - ZipCode gibi nesneleri sarma noktası güvenlik türü. Posta kodu bir dize değil, bir posta kodu. Bir işlev bir posta kodu bekliyorsa, bir posta kodunu değil, yalnızca bir posta kodunu iletebilmelisiniz.
Davor Ždralo

4
Bu, dile özgü bir şekilde kendini hissettiriyor, farklı diller burada farklı şeyler yapıyor. @ DavorŽdralo Aynı genişlikte birçok sayısal tür de eklemeliyiz. "sadece pozitif tamsayılar", "sadece hatta sayılar" hepsi de tür olabilir.
paul23,

6
@ paul23 Evet gerçekten, ve biz ana nedeni yok olanlar var dillerin bir sürü bunları tanımlamak için zarif yollarını destekleyen kalmamasıdır. "Yaş" ı, "derece santigrat derece sıcaklıktan" farklı bir tür olarak tanımlamak tamamen mantıklıdır, ancak "userAge == currentTemıcaklık" saçma olarak algılanırsa.
IMSoP

Yanıtlar:


116

Varsayım, Address sınıfını anlamak için ZipCode sınıfına katılmanıza gerek olmadığıdır . Eğer ZipCode iyi tasarlanmışsa, sadece Address sınıfını okuyarak ne yaptığını açıkça belirtmelisiniz.

Programlar uçtan uca okunmaz - genellikle programlar bunu mümkün kılmak için çok karmaşıktır. Bir programdaki tüm kodu aynı anda aklınızdan çıkaramazsınız. Bu yüzden, programı anlamlı birimler halinde "parçalamak" için soyutlamalar ve enkapsülasyonlar kullanıyoruz, böylece programın bir kısmına (Adres sınıfını söyleyebiliyorsunuz) bağlı olduğu tüm kodları okumak zorunda kalmadan bakabiliyorsunuz.

Örneğin, String kodunda her karşılaştığınızda String kaynak kodunu okumayacağınıza eminim.

Sınıfı ZipCode'dan ZipCodeHelper olarak yeniden adlandırmak iki ayrı kavram olduğunu ileri sürüyor: bir posta kodu ve bir posta kodu yardımcısı. Yani iki kat daha karmaşık. Ve şimdi tip sistemi, aynı tipte olduklarından, rastgele bir dize ile geçerli bir posta kodu arasında ayrım yapmanıza yardımcı olamaz. Bu, “takıntı” nın uygun olduğu yerdir: İlkelde basit bir sarmalayıcı türünden kaçınmak istediğiniz için, daha karmaşık ve daha az güvenli bir alternatif öneriyorsunuz.

İlkel kullanımı, bu özel tipe bağlı olarak doğrulama ya da başka bir mantık bulunmadığı durumlarda IMHO tarafından doğrulanır. Ancak herhangi bir mantık eklediğiniz anda, bu mantığın tiple kapsanması çok daha kolaydır.

Serileştirme gelince, kullandığınız çerçevede bir sınırlama gibi geliyor düşünüyorum. Elbette, bir ZipCode'u bir dizeye seri hale getirebilmeli veya bir veritabanındaki bir sütuna eşleyebilmelisiniz.


2
"Anlamlı birimler" (ana) bölümü ile aynı fikirdeyim, ancak bir posta kodu ve posta kodu doğrulamanın aynı kavram olduğu kadar değil. ZipCodeHelper(ki aramayı tercih ederim ZipCodeValidator) işini yapmak için bir web servisiyle bağlantı kurabilir. Bu, "posta kodu verilerini tut" sorumluluğunun bir parçası olmaz . Tip sistemini geçersiz kılmak, geçersiz posta kodlarını geçersiz kılmak, ZipCodeyapıcıyı Java'nın özel paketine eşdeğer kılmak ve ZipCodeFactorybunu her zaman doğrulayıcıyı çağıran kodla çağırmakla sağlanabilir .
R. Schmitz

16
@ R.Schmitz: “Sorumluluk” un tek sorumluluk ilkesi anlamında anlamı yoktur. Ancak, her durumda, posta kodunu ve onayını aldığınız sürece elbette ihtiyacınız olduğu kadar çok sınıf kullanmalısınız. OP , kötü bir fikir olan posta kodunu saklamak yerine bir yardımcı önerir .
JacquesB

1
Saygılarımla aynı fikirde olmak istiyorum. SRP, bir sınıfın "bir ve sadece bir tanesinin değiştirilme nedenine" sahip olması gerektiği anlamına gelir ("bir posta kodunun" ve "nasıl doğrulandığını" değiştirin). Buradaki özel durum, Temiz Kod kitabında daha ayrıntılı olarak açıklanmaktadır : " Nesneler, verilerini soyutlamaların arkasına gizler ve bu veriler üzerinde çalışan işlevleri gösterir. Veri yapısı, verilerini ortaya çıkarır ve anlamlı işlevleri yoktur. " - ZipCode"veri yapısı" olur. ve ZipCodeHelperbir "nesne". Her durumda, web bağlantılarını ZipCode yapıcısına iletmememiz gerekmediğine katılıyoruz
R. Schmitz

9
İlkel kullanımı, bu özel tipe bağlı olarak doğrulama ya da başka bir mantık bulunmadığı durumlarda IMHO tarafından doğrulanır. => Ben katılmıyorum. Tüm değerler geçerli olsa bile, semantikleri ilkelleri kullanmak yerine dile aktarmayı tercih ederim. Geçerli semantik kullanımı için saçma olan ilkel bir tipte bir fonksiyon çağrılabilirse, o zaman ilkel bir tip olmamalı, sadece tanımlanabilir fonksiyonlara sahip uygun bir tip olmalıdır. (Örnek olarak, intkimlik olarak kullanmak , bir kimliğin bir kimlikle çarpılmasını sağlar ...)
Matthieu M.

@ R.Schmitz Bence ZIP kodları yaptığınız ayrım için kötü bir örnek. Sık sık değişen bir şey ayrı Foove FooValidatorsınıflar için aday olabilir . Biz olabilir bir var ZipCodebiçimini doğrular sınıf ve bir ZipCodeValidatorbazı Web hizmeti isabet doğru biçimlendirilmiş bir kontrol etmek ZipCodeaslında akımdır. ZIP kodlarının değiştiğini biliyoruz. Fakat pratik olarak, ZipCodeyerel veri tabanında veya bazı yerel veritabanlarında bulunan geçerli ZIP kodlarının bir listesi olacak .
Hayır,

55

Yapabilirseniz:

new ZipCode("totally invalid zip code");

Ve ZipCode için yapıcı şunları yapar:

ZipCodeHelper.validate("totally invalid zip code");

Sonra enkapsülasyonu kırdın ve ZipCode sınıfına aptalca bir bağımlılık ekledin. Yapıcı ise gelmez diyoruz ZipCodeHelper.validate(...)o zaman aslında getirmezsek kendi adasında mantığı izole ettik. Geçersiz posta kodları oluşturabilirsiniz.

validateYöntem zipcode sınıfına statik yöntem olmalıdır. Şimdi "geçerli" bir posta kodu bilgisi ZipCode sınıfı ile birlikte paketlenmiştir. Kod örnekleriniz Java'ya benziyorsa, yanlış bir format verilirse ZipCode yapıcısının bir istisna oluşturması gerekir:

public class ZipCode {
    private String zipCode;

    public ZipCode(string zipCode) {
        if (!validate(zipCode))
            throw new IllegalFormatException("Invalid zip code");

        this.zipCode = zipCode;
    }

    public static bool validate(String zipCode) {
        // logic to check format
    }

    @Override
    public String toString() {
        return zipCode;
    }
}

Yapıcı, formatı kontrol eder ve bir istisna atar, böylece geçersiz posta kodlarının oluşturulmasını önler ve statik validateyöntem, başka bir kod için kullanılabilir, bu nedenle formatı kontrol etme mantığı, ZipCode sınıfında kapsüllenir.

ZipCode sınıfının bu varyantında "yo-yo" yoktur. Sadece uygun Nesneye Yönelik Programlama olarak adlandırılır.


Ayrıca burada ZipCodeFormat veya PostalService (örneğin PostalService.isValidPostalCode (...), PostalService.parsePostalCode (...), vb.) Bir başka sınıfa ihtiyaç duyan uluslararasılaşmayı da görmeyeceğiz.


28
Not: @Greg Burkhardt'ın buradaki yaklaşımının ana avantajı, birisi size bir ZipCode nesnesi verirse, türünü ve başarılı bir şekilde yapılandırılmış olmasından dolayı tekrar kontrol etmek zorunda kalmadan geçerli bir dize içerdiğinden emin olabilirsiniz. bu garanti. Bunun yerine dizeleri geçirdiyseniz, geçerli bir posta koduna sahip olduğunuzdan emin olmak için kodunuzun çeşitli yerlerinde "doğrulama (zipCode) yapma" zorunluluğu hissedebilirsiniz, ancak başarıyla oluşturulmuş bir ZipCode nesnesiyle, içeriği tekrar kontrol edilmeden geçerlidir.
Bazı Adam

3
@ R.Schmitz: ZipCode.validateYöntem, bir istisna atan bir kurucu çağırmadan önce gerçekleştirilebilecek ön kontrol yöntemidir.
Greg Burghardt,

10
@ R.Schmitz: Bir vexing istisnasıyla ilgileniyorsanız, yapıya alternatif bir yaklaşım, ZipCode yapıcısını özel kılmak ve iletilen parametrelerin validasyonunu yapan bir genel statik fabrika işlevi (Zipcode.create?) Sağlamaktır. başarısız olursa null değerini döndürür, aksi takdirde bir ZipCode nesnesi oluşturur ve onu döndürür. Arayan kişi elbette boş bir dönüş değeri olup olmadığını kontrol etmek zorunda kalacaktır. Öte yandan, örneğin, bir ZipCode oluşturmadan önce her zaman doğrulamayı (regex? Validate? Vb.) Alışkanlıktaysanız, istisna pratikte can sıkıcı olmayabilir.
Bazı Adam

11
İsteğe Bağlı bir <ZipCode> döndüren bir fabrika işlevi de bir olasılıktır. O zaman arayan kişinin fabrika işlevindeki olası arızaları açıkça ele almaktan başka seçeneği yoktur. Ne olursa olsun, her iki durumda da hata, asıl sorundan uzak olan müşteri kodu tarafından, muhtemelen çok daha sonra değil, yaratıldığı yere yakın bir yerde keşfedilecektir.
Bazı Adam

6
ZipCode'u bağımsız olarak doğrulayamazsınız, bu yüzden yapmayın. ZipCode / PostCode doğrulama kurallarına bakmak için gerçekten Country nesnesine ihtiyacınız var.
Joshua

11

Bu soru ile çok güreşirseniz, belki de kullandığınız dil iş için doğru bir araç değildir? Bu tür "etki alanı tarafından yazılan ilkellerin", örneğin F # ile ifade edilmesi son derece kolaydır.

Örneğin, şöyle yazabilirsiniz:

type ZipCode = ZipCode of string
type Town = Town of string

type Adress = {
  zipCode: ZipCode
  town: Town
  //etc
}

let adress1 = {
  zipCode = ZipCode "90210"
  town = Town "Beverly Hills"
}

let faultyAdress = {
  zipCode = "12345"  // <-Compiler error
  town = adress1.zipCode // <- Compiler error
}

Bu, farklı varlıkların kimliklerini karşılaştırmak gibi yaygın hatalardan kaçınmak için gerçekten yararlıdır. Ve bu ilkel ilkeler bir C # veya Java sınıfından çok daha hafif olduğundan, sonunda onları gerçekten kullanırsınız.


İlginç - validasyonun uygulanmasını istemek nasıl olurdu ZipCode?
Hulk

4
@Hulk FO'da OO stili yazabilir ve sınıfları sınıflara ayırabilirsiniz. Ancak, türü ZipCode = string özel ZipCode tipiyle bildiren ve create işlevine sahip bir ZipCode modülü ekleyerek işlevsel stili tercih ederim. Burada bazı örnekler var: gist.github.com/swlaschin/54cfff886669ccab895a
Guran

@ Bent-Tranberg Düzenleme için teşekkürler. Haklısın, basit bir tür kısaltma derleme zaman tipi güvenliği vermez.
Guran

İlk yorumumu göndermiş olsaydım, sildim, sebebi ilk önce kaynağınızı yanlış anladım. Yeterince dikkatli okumadım. Derlemeye çalıştığımda, sonunda tam olarak bunu göstermeye çalıştığınızı anladım, o yüzden doğru düzeltmek için düzenlemeye karar verdim.
Bent Tranberg

Evet. Özgün kaynağım geçerliydi, ne yazık ki geçersiz olduğu kabul edilen örnek dahil. Doh! Sadece kod yazmak yerine Wlaschin ile bağlantı kurmalı mıyım? :) fsharpforfunandprofit.com/posts/…
Guran

6

Cevap tamamen ZIP kodlarıyla aslında ne yapmak istediğinize bağlıdır. İşte iki aşırı olasılık:

(1) Tüm adreslerin tek bir ülkede olması garanti edilir. Hiç istisna yok. (Örneğin, yabancı bir müşteri veya yabancı bir müşteri için çalışırken özel adresi yurtdışında olan çalışanlar yok.) Bu ülkenin ZIP kodları var ve hiçbir zaman ciddi bir sorun yaşamaması bekleniyor (yani serbest biçimli girdi gerektirmiyor) "şu anda D4B 6N2, ancak bu her 2 haftada bir değişiyor" gibi. ZIP kodları sadece adresleme için değil, ödeme bilgilerinin veya benzeri amaçların doğrulanması için kullanılır. - Bu şartlar altında, bir ZIP kodu sınıfı çok mantıklıdır.

(2) Adresler hemen hemen her ülkede olabilir, bu nedenle ZIP kodları olan veya olmayan (ve binlerce garip istisna ve özel durum içeren) düzinelerce veya yüzlerce adresleme programı söz konusudur. Bir "ZIP" kodu gerçekten yalnızca, ZIP kodlarının kendilerine vermeyi unutmamak için kullanılan ülkelerden insanlara hatırlatması istenir. Adresler yalnızca birisi hesabına erişimini kaybederse ve isimlerini ve adreslerini ispat edebilmeleri durumunda erişimin geri kazanılmasını sağlamak için kullanılır. - Bu şartlar altında, ilgili tüm ülkeler için ZIP kodu sınıfları çok büyük bir çaba olacaktır. Neyse ki onlar gerekli değildir.


3

Diğer cevaplar, OO alan modellemesi ve değerinizi temsil etmek için daha zengin bir tip kullanma hakkında konuştu.

Kabul etmiyorum, özellikle de gönderdiğiniz örnek kod verildiğinde.

Fakat bunun da sorunuzun başlığına cevap verip vermediğini merak ediyorum.

Şu senaryoyu inceleyin (üzerinde çalıştığım gerçek bir projeden çıkarılan):

Merkezi sunucunuzla konuşan bir saha cihazında uzak bir uygulamanız var. Aygıt girişi için DB alanlarından biri, alan aygıtının bulunduğu adres için bir posta kodudur. Posta kodunu umursamıyorsunuz (veya bu konuda adresin geri kalanından herhangi birini). Bunu önemseyen herkes, bir HTTP sınırının diğer tarafındadır: Siz sadece veriler için tek bir gerçeğin kaynağı olursunuz. Etki alanı modellemenizde yeri yok. Siz sadece kaydedin, doğrulayın, saklayın ve istek üzerine başka bir noktaya işaret etmek için bir JSON blobunda karıştırın.

Bu senaryoda, eki bir SQL regex kısıtlamasıyla (veya ORM eşdeğeriyle) doğrulamanın ötesinde bir şey yapmak muhtemelen YAGNI çeşidinin sorumluluğudur.


6
SQL regex kısıtınız nitelikli bir tür olarak görülebilir - veritabanınızda, Zip kodu "VarChar" olarak değil, "Bu kural tarafından kısıtlanan" VarChar "olarak depolanır. Bazı DBMS'lerde bu tip + kısıtlamayı yeniden kullanılabilir bir "etki alanı türü" olarak kolayca bir ad verebilirsiniz ve verilere anlamlı bir tür vermek için önerilen yere geri döndük. Prensip olarak cevabınıza katılıyorum, ancak örneğin uyuşmadığını sanmıyorum; Verileriniz "ham sensör verileri" ise en iyi örnek, en anlamlı tür "byte dizisi" olur; çünkü verilerin ne anlama geldiğini bilmiyorsunuz.
IMSoP

@IMSoP ilginç nokta. Yine de aynı fikirde olmadığımdan emin değilim: Java'daki bir dize posta kodunu (veya başka bir dilde) bir regex ile doğrulayabilirsiniz, ancak yine de daha zengin bir tür yerine dize olarak çalışıyor olabilirsiniz. Etki alanı mantığına bağlı olarak daha fazla manipülasyon gerekebilir (örneğin posta kodunun durumla eşleşmesini sağlamak, regex ile doğrulamak zor / imkansız olan bir şey).
Jared Smith

Sen olabilir , ama en kısa zamanda bunu gibi, bunu bazı alana özgü davranış atfederek vardır ve bu alıntı eşyalar özel tip yaratılmasına yol açacaktır söylediğini tam olarak ne olduğunu. Soru olup olmadığı değil edebilir bir tarzda veya diğerinde bunu, ama olsun gerektiğini , programlama dili varsayarak size seçenek sunar.
IMSoP

Böyle bir şeyi RegexValidatedStringdizenin kendisini ve onu doğrulamak için kullanılan regex'i içeren bir model oluşturabilirsiniz . Ancak, her vakanın kendine özgü bir regex'i olmadıkça (ki bu mümkün olabilir, ancak olası değil) bu biraz aptalca ve boşa harcanmış bir hafıza gibi görünüyor (ve muhtemelen regex derleme zamanı). Öyleyse regex'i ayrı bir tabloya yerleştirirsiniz ve bulmak için her durumda bir arama anahtarı bırakırsınız (bu dolaylı olarak muhtemelen tartışmasızdır) veya bu kuralı paylaşan her ortak değer türü için bir kez saklamanın bir yolunu bulursunuz - - Örneğin. bir etki alanı türündeki statik bir alan veya IMSoP'nin dediği gibi eşdeğer bir yöntem.
Miral

1

ZipCodeSenin eğer soyutlama sadece anlamlı olamaz Addresssınıfı da yoktu TownNameözelliği. Aksi takdirde, yarım bir soyutlamaya sahipsiniz: posta kodu kasabayı belirtir, ancak bu iki bilgi parçası farklı sınıflarda bulunur. Hiç mantıklı gelmiyor.

Ancak, o zaman bile, hala ilkel takıntı doğru bir uygulama (ya da daha doğrusu çözüm) değildir; Anladığım kadarıyla iki şeye odaklanıyor:

  1. İlkellerin, özellikle ilkel bir koleksiyon gerekli olduğunda, bir yöntemin girdi (veya çıktı) değerleri olarak kullanılması.
  2. Bunların bir kısmının kendi alt sınıflarına ayrılıp ayrılmayacağını yeniden düşünmeden zaman içerisinde ekstra özellikler yetiştiren sınıflar.

Senin durumun da değil. Bir adres açıkça gerekli özellikleri olan (cadde, numara, posta kodu, kasaba, eyalet, ülke, ...) iyi tanımlanmış bir kavramdır. Tek bir sorumluluğa sahip olduğu için bu verileri bölmek için çok az veya hiç sebep yok : Dünya üzerinde bir yer belirleyin. Bir adres anlamlı olmak için bu alanların tümünü gerektirir . Yarım adres anlamsız.

Bu şekilde, daha fazla alt bölüme ayırmanız gerekmediğini biliyorsunuz: daha fazla parçalara ayırmak, Addresssınıfın işlevsel niyetinden düşecektir . Benzer şekilde, (bağlı bir kişi olmadan) etki alanınızdaki anlamlı bir kavram olmadığı sürece Name, Personsınıfta kullanılacak bir alt sınıfa ihtiyacınız yoktur Name. Hangi (genellikle) değil. İsimler insanları tanımlamak için kullanılır, genellikle kendi başlarına hiçbir değeri yoktur.


1
@RikD: Cevaptan: " Adınız (kişi eklenmemişse) etki alanınızdaki anlamlı bir kavram değilseName , Personsınıfta kullanılacak bir alt sınıfa ihtiyacınız yoktur ." Adlar için özel doğrulama yaptığınızda, ad, etki alanınızda anlamlı bir kavram haline gelmiştir; ki alt tipi kullanmak için açıkça geçerli bir dava olarak bahsetmiştim. İkincisi, posta kodu doğrulaması için, belirli bir ülkenin biçimini izlemesi gereken posta kodları gibi ek varsayımlar sunarsınız. OP'nin sorusunun amacından çok daha geniş bir konuyu ele alıyorsunuz.
Flater

5
" Bir adres açıkça gerekli özelliklere (cadde, sayı, zip, kasaba, eyalet, ülke) ile iyi tanımlanmış bir kavramdır. " - Eh sadece düz yanlış olduğunu. Bununla başa çıkmanın iyi bir yolu için Amazon'un adres formuna bakın.
R. Schmitz

4
@Flater Eh, yanlışların tam listesini okumadığınız için sizi suçlamayacağım, çünkü oldukça uzun, ama kelimenin tam anlamıyla "Adreslerin caddesi olacak", "Adres hem şehir hem de ülke gerektiriyor", "Bir adres Alıntı yapılan cümlenin söylediğine aykırı bir posta kodu "vb. olacaktır.
R. Schmitz

8
@GregBurghardt "Posta kodu, Amerika Birleşik Devletleri Posta Hizmeti'ni kabul eder ve şehrin adını posta kodundan alabilirsiniz. Şehirler birden fazla posta koduna sahip olabilir, ancak her posta kodu yalnızca 1 şehre bağlanır." Bu genel olarak doğru değil. Genel olarak komşu bir şehir için kullanılan bir posta kodum var, ancak ikametgahım orada bulunmuyor. Posta kodları her zaman devlet sınırlarına uymaz. Örneğin 42223, hem TN hem de KY'den ilçeler içerir .
JimmyJames

2
Avusturya'da sadece Almanya'dan erişilebilen bir vadi var ( en.wikipedia.org/wiki/Kleinwalsertal ). Bu bölge için, başka şeylerin yanı sıra, bu bölgedeki adreslerin hem Avusturya hem de Alman posta kodlarına sahip olduğunu da içeren özel bir anlaşma var. Genel olarak, bir adresin yalnızca geçerli bir posta koduna sahip olduğunu varsayamazsınız;)
Hulk

1

Makaleden:

Daha genel olarak, yo-yo problemi, bir insanı bir kavramı anlamak için farklı bilgi kaynakları arasında çevirmeye devam etmesi gereken herhangi bir durumu da ifade edebilir.

Kaynak kodu , yazıldığından çok daha sık okunur . Bu nedenle, yo-yo problemi, birçok dosya arasında geçiş yapmak zorunda kalmak bir konudur.

Bununla birlikte, hayır , yo-yo problemi derinlemesine bağımlı modüller veya sınıflarla (bunlar arasında ileri geri gelen) uğraşırken çok daha anlamlı hisseder. Bunlar okumak için özel bir kabus ve muhtemelen yo yo probleminin aklındakilerdi.

Ancak - evet , çok fazla soyutlama katmanından kaçınmak önemlidir!

Tüm önemsiz olmayan soyutlamalar, bir dereceye kadar, sızdırıyor. - Sızdıran Soyutlamalar Kanunu.

Örneğin, mmmaaa’nın " Adres sınıfını anlamak için ZipCode sınıfını [(ziyaret et]] 'e ihtiyacınız yok " ) cevabında yapılan varsayımlara katılmıyorum . Tecrübelerim senin yaptığın en azından ilk birkaç kez kodu okudun. Ancak, diğerlerinin de belirttiği gibi, bir sınıfın uygun olduğu zamanlar vardır ZipCode.

YAGNI (Ya vermeyecek mi ihtiyacınız O) (çok fazla katmanlarla kodu) lazanya kodunu önlemek için takip etmenin tam kalıptır - soyutlamalar gibi türleri olarak ve sınıfları programcı orada yardım etmek ve bunlar olmadıkça kullanılmamalıdır vardır bir yardım.

Şahsen "kod satırlarını kaydetmeyi" (ve tabii ki ilgili "dosyaları / modülleri / sınıfları kaydet" vb.) Hedefliyorum. Bana “ilkel takıntılı” sıfatını uygulayacak bazılarının olduğuna eminim - etiketler, kalıplar ve kalıplaşma kalıpları için endişelenmekten ziyade kolay anlaşılır bir kodun olmasını daha önemli buluyorum . Bir fonksiyonun ne zaman, bir modül / dosya / sınıf ne zaman yaratılacağı veya bir fonksiyonun ortak bir yere ne zaman konulacağı doğru bir seçimdir. Yaklaşık 3-100 satır işlevi, 80-500 satır dosyası ve yeniden kullanılabilir kütüphane kodu için "1, 2, n" ( SLOC - yorumlar veya kazan plakası dahil değil; zorunlu olarak her satır için en az 1 ek SLOC istiyorum.) Basmakalıp).

Çoğu olumlu kalıp, geliştiricilerin ihtiyaç duyduklarında tam olarak bunu yapmalarından kaynaklanmaktadır . Nasıl okunabilir kod yazılacağını öğrenmek, çözmek için aynı problemi olmayan desenleri uygulamaya çalışmaktan çok daha önemlidir. Herhangi bir iyi geliştirici, alışılmadık bir durumda daha önce görmeden fabrika şablonunu kendi problemine uygun olduğu durumlarda uygulayabilir. Fabrika modelini, gözlemci modelini kullandım ve muhtemelen adlarını bilmeden yüzlerce kişi kullandım (yani, "değişken atama modeli" var mı?). Eğlenceli bir deneme için - JS diline kaç tane GoF paterni yerleştirildiğini görün - 2009'da 12-15 yıl sonra saymayı kestim. Fabrika modeli bir nesneyi bir JS kurucusundan döndürmek kadar basit, örneğin - gerek yok Bir WidgetFactory.

Yani - evet , bazen ZipCode iyi bir sınıftır. Ancak, hayır , yo-yo problemi kesinlikle ilgili değil.


0

Yoyo problemi sadece ileri geri çevirmeniz gerektiğinde geçerlidir. Buna bir veya iki şey neden olur (bazen her ikisi de):

  1. Kötü adlandırma ZipCode iyi görünüyor, ZoneImprovementPlanCode çoğu insan tarafından bakılmasını gerektirecek (ve etkilenmeyenlerin sayısı çok az).
  2. Uygunsuz bağlantı ZipCode sınıfının bir alan kodu araması olduğunu söyleyin. İşe yarar olduğunu düşünebilirsiniz, çünkü kullanışlı, ancak gerçekten ZipCode ile ilgili değil ve onu içine sokmak artık insanların bir şeyler için nereye gideceğini bilmediği anlamına geliyor.

İsme bakabilir ve ne yaptığı hakkında makul bir fikre sahipseniz, yöntemler ve özellikler oldukça açık şeyler yaparsa, koda bakmanıza gerek kalmaz, sadece kullanabilirsiniz. İlk başta bütün sınıfların noktası budur - bunlar yalıtımlı olarak kullanılabilecek ve geliştirilebilecek modüler kod parçalarıdır. Sınıfın ne yaptığını görebilmesi için API dışında bir şeye bakmanız gerekiyorsa, bu en iyi ihtimalle kısmi bir başarısızlıktır.


-1

Unutma, gümüş kurşun yok. Hızlı taranması gereken son derece basit bir uygulama yazıyorsanız, basit bir dize işi yapabilir. Ancak , zamanın% 98'inde DDD'de Eric Evans tarafından tanımlandığı gibi bir Değer Nesnesi , mükemmel bir seçim olacaktır. Değer nesnelerinin sağladığı tüm faydaları kolayca okuyabilirsiniz.

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.