Çok fazla soyutlama kötü olabilir mi?


46

Programcılar olarak hedefimizin verilen alan modeli ve işletme mantığı hakkında iyi soyutlamalar sağlamak olduğunu düşünüyorum. Fakat bu soyutlama nerede durmalı? Soyutlama ile tüm faydaları (esneklik, değişme kolaylığı vb.) Arasındaki değiş tokuşu nasıl yapıp, kodu ve tüm faydalarını anlama kolaylığı .

Aşırı soyutlanmış kod yazma eğiliminde olduğuma inanıyorum ve bunun ne kadar iyi olduğunu bilmiyorum; Genellikle iki bölümden oluşan bir tür mikro-çerçeve gibi yazma eğilimindeyim:

  1. Mikro çerçeveye bağlı olan Mikro Modüller: Bu modüllerin anlaşılması, geliştirilmesi ve tek bir ünite olarak bakımı kolaydır. Bu kod, temelde, gereksinimlerde açıklanan işlevsel unsurları gerçekten yapan kodu temsil eder.
  2. Bağlantı kodu; şimdi burada sorun olduğuna inanıyorum. Bu kod karmaşık olma eğilimindedir, çünkü bazen çok soyutlanır ve başlangıçta anlaşılması zordur; bu, sadece saf soyutlama olduğu gerçeğinden, gerçeğin temelini ve iş mantığını sunulan kodda gerçekleştirilen 1; Bu nedenle, test edildikten sonra bu kodun değiştirilmesi beklenmemektedir.

Programlamada bu iyi bir yaklaşım mıdır? Değişen kodun birçok modülde çok parçalanmış ve anlaşılması çok kolay ve değişmeyen kodun soyutlama POV'sinden çok karmaşık olması. Tüm kodlar tekdüze olarak karmaşık olmalı mı (kod 1 daha karmaşık ve birbirine bağlı ve kod 2 daha basit), bu nedenle, onu inceleyen herhangi birinin makul bir süre içinde anlayabilmesi için ancak değişimin pahalı olması veya yukarıda sunulan çözümün iyi olması durumunda "kod değiştirme" anlaşılması, hata ayıklanması, değiştirilmesi ve "kod kodunun bağlanması" çok zor.

Not: Bu kod okunabilirliği ile ilgili değil! 1 ve 2'deki her iki kod da okunabilir, ancak 2'deki kod daha karmaşık soyutlamalarla gelirken, kod 1 basit soyutlamalarla gelir.


3
Yorumlar ve açık adlar, karmaşık kodu anlamak için gereken zamanı hızlandırmak için icat edilir. Alt seviye kodunuzun daha karmaşık olması için gayet iyi; Bir seviyede, neredeyse kesinlikle çok daha karmaşık ve çok daha düşük bir seviyeye çağırıyorsun.
DougM

25
“Çok fazla” tanım gereği kötüdür.
Jon Purdy

@JimmyHoffa: Bu türleri onların yerinde tutmalıyım. Ve kıskanma, bütün gün Haskell'i yazamıyorum . Çoğunlukla PHP, JavaScript ve OCaml.
Jon Purdy

Yanıtlar:


78

TC ++ PL4'ün ilk sözleri:

Bilgisayar bilimlerindeki tüm problemler, çok fazla dolaylı katman problemi dışında, başka bir dolaylı seviye ile çözülebilir. - David J. Wheeler

(David Wheeler benim tez danışmanımdı. Son satır önemli olmayan alıntıya bazen "Bilgisayar Biliminin ilk yasası" denir.)


6
Ve çok fazla dolaylı seviyeye sahip olduğunuzu nereden biliyorsunuz? Tecrübe ile geldiğini söylemeye meyilliyim, ama daha deneyimli bir programcı daha fazla dolaylı işlemi kolayca anlıyor, bu yüzden çok fazla seviyede bir problem görmüyor.
m3th0dman

2
@ m3th0dman - Gelecekte değişiklik yapmak kolaylaştığında doğru soyutlama seviyesine sahipsiniz. Elbette, soru döngüsünü farklı bir şekilde tekrarlayan, bunun ne zaman gerçekleşeceğini nasıl bildiğinizi de sorabilirsiniz.


1
Bu soru programcı düzeyinde bağımlı gibi .. çılgın 8 katmanlı katman mimarisini anlayacak ve onu mükemmel bulabilecek karmaşık programcılara sahip olacaksınız, diğer basit ama düzgün kodlayıcılar saçma bulacak ve çılgın 8 katmanlı hakkında tartışacaklar Katmanlı proje .. burası dokümantasyonun karşılığını verir, sadece kodunuzu belgelemenize izin
Ryan,

1
cehaletim afedersin, ama ben "TC ++ PL4" anlamıyorum
LastTribunal

30

Evet kesinlikle. Mesele şu ki, soyutlama mükemmel değil. Soyutlamanın üzerine oturduğu katmanın tüm detayları bir nedenden dolayı var ve birçok şeyi basitleştirebiliyor, ancak eğer bir noktada bu karmaşıklık gerekli olmasaydı, muhtemelen ilk başta orada olmazdı. Bu da bir noktada, her soyutlamanın bir şekilde sızacağı anlamına geliyor .

Ve asıl problem burada yatıyor. Soyutlamalar başarısız olduğunda, yazdığınız kodla gerçekte ne olup bittiği arasına katılaştıkça, sorunun çözülmesi ve düzeltilmesi zorlaşır, çünkü sorunun olabileceği daha fazla yer vardır. Ve ne kadar çok katman varsa, onu bulmak için o kadar çok şey bilmek zorundasınız.


1
“Bu da bir noktada, her soyutlamanın bir şekilde sızacağı anlamına geliyor.”: Doğru. Daha iyi bir soyutlama, daha az sızıntı yapandır.
Giorgio,

11
Bjarne'nin cevabı ışığında (ve David Wheeler'ın wiki sayfasını referans alarak ), belki teklif sıfatınızı değiştirebilir misiniz? :)
congusbongus

2
@CongXu: Btw Ben diğer taraftan gittim: "Bjarne Stroustrup alıntılar" için googling ve "başka bir dolaylı katman ekleyerek" cümlesini söyleyen tek bir Bjarne referansı bulamadım ... elbette değil bunu ilk olasılığa düşüren son derece muhtemel kılın.
Marjan Venema

1
Daha fazla soyutlama katmanı basit soyutlamalar ve dolayısıyla soyutlama başına daha az sızıntı anlamına gelir. Bu nedenle, matematiksel bir formülasyonda (elbette, herhangi bir kanıt olmadan), soyutlama sızıntısının toplamı, soyutlama seviyelerinin sayısı değiştikçe sabit olabilir.
m3th0dman

2
Bir keresinde, ihtiyaç duyulmayan bir yere soyutlama yapmak için kıdemli bir tavsiyede bulundum. İlk başta yapmak istediklerimin ötesinde asla kullanılmadı.
Cees Timmerman

15

Evet kesinlikle.

Programlamayı açıklamakta kullanmaktan hoşlandığım bir terzi bir Terzininkidir. Bir takım elbise giyerken iyi bir Terzi, giysinin genel şeklini veya yapısını değiştirmeden içeri veya dışarı alınmasına izin vermek için giysi içindeki stratejik yerlerde daima küçük bir miktar kumaş bırakacaktır.

İyi Terzi, üçüncü bir kol yetiştirme veya hamile kalmaya başladığın her bir dikişte kumaş parçaları bırakmaz. Yanlış yerlerde çok fazla malzeme olması, kötü uyuşukluk yaratacak ve kötü giyecek bir kıyafet için ekstra kumaşı normal kullanım biçimine sokacaktır. Küçük kumaşa ve giysiye yırtılma eğilimi gösterir ve giysinin oturma şeklini etkileyerek, kullanıcının fiziğindeki ufak değişikliklerle başa çıkmak için değiştirilemez.

Belki bir gün, İyi Terzimiz, içine giydiği elbiseyi dikmek için çok sıkı bir elbise yapmakla görevlendirilecektir. Ve belki de İyi Terzimizden stil ve formun rahatlık ve genişleme kabiliyetine ikinci olduğu annelik giyimini yapması istenir. Ancak, bu özel işlerden herhangi birini üstlenmeden önce iyi bir Terzi, herkesin bu hedeflere ulaşmak için yapılan ödünlerin farkında olmasını sağlayacak kadar akıllıca olacaktır.

Bazen bu uzlaşmalar alınacak doğru yoldur ve insanlar sonuçlarını kabul etmeye isteklidirler. Ancak çoğu durumda, en fazla saydığı yerde bırakma yaklaşımı, algılanan yararlardan ağır basacaktır.

Yani, bunu soyutlamaya geri döndürmek. Kesinlikle çok fazla soyutlama katmanına sahip olmak, tıpkı çok azına sahip olmak gibi. Programcının gerçek sanatı, bizim terzi dostlarımız gibi, en çok önem verdiği yere biraz bırakmaktır.

Konuya geri dönelim.

Kodla ilgili sorun genellikle soyutlama değil bağımlılıklardır. Belirttiginiz gibi, sorun olan ayrık nesneleri birbirine bağlayan kod, çünkü aralarında gizli bir bağımlılık var. Bir noktada bazı şeyler arasındaki iletişimin sadece somut olması gerekir, ancak bu noktanın nerede olduğuna karar vermek genellikle biraz tahmin gerektirir.

Bu varlık "Mikro" şey sizin nesne düzenini overgranulized ettik ve muhtemelen kullandığınız genellikle bir göstergesidir söyledi Tipi ne olması gerektiği ile eşanlamlı olarak Veri . Daha az şeye sahip olmak aynı zamanda aralarında iletişim kurmak için daha az bağımlılık anlamına gelir.

Bu nedenle sistemler arasında zaman uyumsuz mesajlaşma hayranıyım. Birbirine değil , mesaja bağlı iki sistemle sonuçlanır . Haberleşme sistemleri arasında size daha az sıkı bağlantı sağlar. Bu noktada, sistemler arasında bir bağımlılığa ihtiyacınız varsa, doğru yerlere bağlı olan bitlere sahip olup olmadığınızı düşünmeniz gerekir. Ve genellikle bunu yapmazsınız.

Sonunda, karmaşık kod karmaşık olacak. Bunun etrafında genellikle bir yolu yoktur. Ancak daha az bağımlılığı olan kodun anlaşılması, çeşitli dış durumlara dayanan koddan daha kolaydır.


2
"İyi Terzi, her dikişte kumaş toplarını bırakma, sadece bir üçüncü kol yetiştirme veya hamile kalmaya başladığın için" +1. Ne yazık ki, genellikle yazılımı bu şekilde tasarlama eğilimindeyiz.
Kemoda

Anlaşılabilirliğin yanı sıra, kavisli bir çizgiyi düz bir çizgide bükerken soyutlama da faydalı olabilir. Yani soyutlama ile karmaşıklığı ve / veya entropiyi azaltıyorsunuz. Belki daha sonra tıraş ettiğiniz yağın hala yararlı olduğu bir Curry tipi veri işleyici gibi bir şey.
Cody,

13

Amacımız verilen etki alanı modeli ve iş mantığı üzerinde iyi soyutlamalar sağlamak olduğunu hissediyorum.

Farklı bir görüşüm var: Hedefimiz bir iş problemini çözmek. Soyutlamalar sadece bir çözümü organize etmek için kullanılan bir tekniktir. Başka bir cevap terzilik giysi benzetmesini kullanır. Düşünmek istediğim başka bir benzetmem var: bir iskelet. Kod bir iskelet gibidir ve soyutlamalar kemikler arasındaki eklemlerdir. Eğer ekleminiz yoksa, o zaman hiç hareket edemeyen ve işe yaramaz olan tek bir kemik ile sararsınız. Fakat çok fazla ek yeriniz varsa, kendi kendine ayağa kalkamayacak kadar özensiz bir jöle yığınıyla sarılırsınız. İşin püf noktası, doğru dengeyi bulmaktır - harekete izin verecek kadar eklem, ancak gerçek bir tanımlanmış şekil veya yapı olmadığı kadar değil.

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.