Anti-desen nedir?


193

Desenler ve anti-desenler üzerine çalışıyorum. Desenler hakkında net bir fikrim var, ancak anti-desen almıyorum. Web ve Wikipedia'dan gelen tanımlar beni çok karıştırıyor.

Birisi bana bir anti-paternin ne olduğunu basit bir şekilde açıklayabilir mi? Amaç ne? Onlar ne yapar? Kötü bir şey mi yoksa iyi bir şey mi?




Kötü kabul edilir, ancak tek çözüm olabilir. İki kere düşün ve git.
Константин Ван

Yanıtlar:


245

Anti-paternler , yazılım geliştirmede kötü programlama uygulamaları olarak kabul edilen belirli paternlerdir.

Biçimlendirilmiş ve genellikle iyi bir geliştirme uygulaması olarak kabul edilen ortak sorunlara ortak yaklaşımlar olan tasarım kalıplarının aksine , anti-kalıplar zıttır ve istenmeyen bir durumdur.

Örneğin, nesne yönelimli programlamada, fikir, yazılımı nesne adı verilen küçük parçalara ayırmaktır. Nesne yönelimli programlamadaki bir anti-desen, farklı nesnelere daha iyi ayrılacak birçok işlevi yerine getiren bir Tanrı nesnesidir .

Örneğin:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

Yukarıdaki örnekte her şeyi yapan bir nesne vardır . Nesne yönelimli programlamada, kodu daha az bağlı ve sonuçta daha sürdürülebilir tutmak için farklı nesneler için iyi tanımlanmış sorumluluklara sahip olmak tercih edilir:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

Sonuç olarak, yaygın olarak kullanılan desenlerle ( tasarım desenleri ) yazılım geliştirmenin iyi yolları vardır, ancak aynı zamanda yazılımların geliştirilmesine ve uygulanmasına neden olan ve sorunlara yol açabilecek yollar da vardır. Kötü yazılım geliştirme uygulamaları olarak kabul edilen örüntüler anti örüntülerdir.


9
GodObject dışında başka Anti-Patterns örnekleri var mı?
Tomasz Mularczyk

@Tomasz Programlama Makarna servisi böyle bir örnektir. En iyi, birçok küçük nesne arasında zayıf kapsülleme olarak genelleştirilir. O Tanrı nesne tersi düşünün en.wikipedia.org/wiki/Spaghetti_code
AWrightIV

@Tomasz kötü, ama bazı insanlar tarafından yapılan bir şey bir antipatterndir. Örneğin, try: <do something>; except: passPython'daki Kardinal Sin antipattern olabilir. Şuna
eric

1
Bir Singleton bir anti-desen olarak düşünülebilir, çünkü testleri paralel olarak takıp çalıştırmayı zorlaştırır (tüm testler aynı singletonu kullandığından ve mutasyona uğradığından, tutarsızlıklarla sonuçlanır)?
lostsoul29

63

Anti-desenleri her duyduğumda başka bir terim hatırlıyorum. Tasarım kokusu.

"Tasarım kokuları, tasarımda temel tasarım ilkelerinin ihlal edildiğini ve tasarım kalitesini olumsuz etkileyen belirli yapılardır." ("Yazılım Tasarım Kokularının Yeniden Düzenlenmesi: Teknik Borcun Yönetilmesi")

İhlal eden tasarım ilkelerine göre sınıflandırılmış birçok tasarım kokusu vardır:

Soyutlama kokuları

Eksik Soyutlama: Bu koku, bir sınıf veya arabirim oluşturmak yerine veri kümeleri veya kodlanmış dizeler kullanıldığında ortaya çıkar.

Emir Kipi Soyutlama: Bu koku bir operasyon sınıfa dönüştürüldüğünde ortaya çıkar.

Eksik Soyutlama: Bu koku, bir soyutlama tamamlayıcı veya birbiriyle ilişkili yöntemleri tamamen desteklemediğinde ortaya çıkar.

Çok Yönlü Soyutlama: Bu koku, bir soyutlamanın kendisine atanmış birden fazla sorumluluğu olduğunda ortaya çıkar.

Gereksiz Soyutlama: Bu koku, aslında gerekli olmayan (ve bundan kaçınılabilen) bir soyutlama bir yazılım tasarımına dahil edildiğinde ortaya çıkar.

Unutilized Abstraction: Bu koku, bir soyutlama kullanılmadan bırakıldığında ortaya çıkar (doğrudan kullanılmaz veya ulaşılamaz).

Yinelenen Soyutlama: Bu koku, iki veya daha fazla soyutlamanın özdeş isimlere veya aynı uygulamaya veya her ikisine birden sahip olması durumunda ortaya çıkar.

Kapsülleme kokuları

Eksik Kapsülleme: Bu koku, bir soyutlamanın bir veya daha fazla üyesinin bildirilen erişilebilirliği, gerçekten gerekenden daha izin vericiyse oluşur.

Sızdıran Kapsülleme: Bu koku, genel bir arayüz aracılığıyla bir soyutlama uygulama ayrıntılarını “ortaya çıkardığında” veya “sızdıysa” ortaya çıkar.

Eksik Kapsülleme: Bu koku, uygulama varyasyonları bir soyutlama veya hiyerarşi içinde kapsüllenmediğinde ortaya çıkar.

Açıklanamayan Kapsülleme: Bu koku, bir hiyerarşi içinde zaten kapsüllenmiş türlerdeki varyasyonlardan yararlanmak yerine, istemci kodu açık tür denetimleri (nesnenin türünü denetleyen zincirlenmiş if-else veya switch deyimlerini kullanarak) kullandığında ortaya çıkar.

Modülerleştirme kokuları

Kırık Modülerleştirme: Bu koku, ideal olarak tek bir soyutlamada lokalize edilmesi gereken veri ve / veya yöntemler ayrıldığında ve birden fazla soyutlamaya yayıldığında ortaya çıkar.

Yetersiz Modülerleştirme: Bu koku tamamen ayrışmamış bir soyutlama olduğunda ortaya çıkar ve başka bir ayrışma boyutunu, uygulama karmaşıklığını veya her ikisini de azaltabilir.

Döngüsel Olarak Bağımlı Modülerleştirme: Bu koku, iki veya daha fazla soyutlamanın doğrudan veya dolaylı olarak birbirine bağlı olması durumunda ortaya çıkar (soyutlamalar arasında sıkı bir bağlantı oluşturur).

Hub Benzeri Modülerleştirme: Bu koku, bir soyutlamanın çok sayıda diğer soyutlama ile bağımlılıkları (hem gelen hem de giden) olduğunda ortaya çıkar.

Hiyerarşi kokuları

Eksik Hiyerarşi: Bu koku, bir kod segmenti, bir hiyerarşinin oluşturulabileceği ve bu varyasyonları kapsüllemek için kullanılabileceği davranıştaki varyasyonu açıkça yönetmek için koşullu mantık (tipik olarak "etiketli türler" ile birlikte) kullandığında ortaya çıkar.

Gereksiz Hiyerarşi: Bu koku tüm miras hiyerarşisi gereksiz olduğunda ortaya çıkar, bu da mirasın belirli bir tasarım bağlamında gereksiz yere uygulandığını gösterir.

Etkisiz Hiyerarşi: Bu koku, bir hiyerarşideki türler arasında gereksiz çoğalma olduğunda ortaya çıkar.

Geniş Hiyerarşi: Bu koku, ara türlerin eksik olabileceğini belirten bir kalıtım hiyerarşisi “çok” geniş olduğunda ortaya çıkar.

Spekülatif Hiyerarşi: Bu koku, bir hiyerarşideki bir veya daha fazla tür spekülatif olarak sağlandığında (yani, gerçek gereksinimler yerine hayal edilen ihtiyaçlara dayanarak) ortaya çıkar.

Derin Hiyerarşi: Bu koku, bir miras hiyerarşisi “aşırı” derin olduğunda ortaya çıkar.

Asi Hiyerarşi: Bu koku, bir alt tip, süper tip (ler) inin sağladığı yöntemleri reddettiğinde ortaya çıkar.

Kırık Hiyerarşi: Bu koku, bir üst tip ve alt tipi kavramsal olarak kırık ikame edilebilirliği ile sonuçlanan bir “IS-A” ilişkisini paylaşmadığında ortaya çıkar.

Çok Yollu Hiyerarşi: Bu koku, bir alt tür hem doğrudan hem de dolaylı olarak hiyerarşide gereksiz kalıtım yollarına yol açan bir üst türden miras kaldığında ortaya çıkar.

Döngüsel Hiyerarşi: Bu koku, bir hiyerarşideki bir üst tür alt türlerinden birine bağlı olduğunda ortaya çıkar.


Yukarıdaki tanım ve sınıflandırma "Yazılım tasarımı kokularını yeniden düzenleme: Teknik borcun yönetimi" bölümünde açıklanmaktadır . Daha alakalı bazı kaynaklar burada bulunabilir .


41

Bir örüntü, bir sınıftaki bir problemin nasıl çözüleceğine dair bir fikirdir. Bir anti-desen, nasıl çözülmeyeceğine dair bir fikirdir, çünkü bu fikri uygulamak kötü tasarımla sonuçlanacaktır.

Bir örnek: "kalıp" kodun yeniden kullanımı için bir işlev, "kalıp önleme" ise kopyala-yapıştır kullanmak için kullanılır. Her ikisi de aynı sorunu çözer, ancak bir işlev kullanmak genellikle kopyala-yapıştırdan daha okunabilir ve bakımı kolay bir koda yol açar.


18

Bir anti-desen bir sorunu çözmemenin bir yoludur. Ancak daha fazlası da var: bu aynı zamanda sorunu çözme girişimlerinde sıkça görülebilen bir yoldur.


13

Eğer gerçekten AntiPatterns çalışmak istiyorsanız, AntiPatterns (ISBN-13: 978-0471197133) kitabını edinin .

İçinde, "Bir AntiPattern, kesinlikle olumsuz sonuçlar üreten bir soruna yaygın olarak ortaya çıkan bir çözümü tanımlayan edebi bir formdur."

Bu nedenle, kötü bir programlama uygulaması ancak ortak bir uygulama değilse - bir uygulama, bir şirket veya bir programcı ile sınırlıysa, AntiPattern tanımının "Desen" bölümünü karşılamaz.


9

Ortalığı karıştırmanın yaygın bir yolu. Örneğin tanrı / kitchensink sınıfı gibi (her şeyi yapar).


6

İlginç bir şekilde, bir problemi çözmenin belirli bir yolu hem bir desen hem de bir anti-desen olabilir. Singleton bunun en iyi örneğidir. Her iki literatürde de görünecektir.


6

Bir anti-desen , bir tasarım deseninin tamamlayıcısıdır . Anti-desen, belirli bir durumda kullanmamanız gereken bir şablon çözümüdür.


6

Tıpkı bir tasarım deseninde olduğu gibi , bir anti-desen de belirli bir problemi çözmenin tekrarlanabilir bir yoludur, ancak optimal olmayan ve etkisiz bir şekilde.


4

Günümüzde yazılım mühendisliği araştırmacıları ve uygulayıcıları sıklıkla “anti-desen” ve “koku” terimlerini birbirinin yerine kullanırlar. Ancak, kavramsal olarak aynı değildirler. Wikipedia anti-patern girişi, bir anti-paternin kötü bir uygulamadan veya kötü bir fikirden en az iki faktörden farklı olduğunu belirtir. Bir anti-desen

"Bir soruna başlangıçta uygun ve etkili bir yanıt gibi görünse de, genellikle yararlı sonuçlardan daha kötü sonuçlara yol açan, yaygın olarak kullanılan bir işlem, yapı veya eylem modeli."

Açıkça görülüyor ki, sunulan soruna iyi bir çözüm (desen olarak) olduğu inancında bir anti-desen seçilmiştir; ancak, faydadan daha fazla yükümlülük getirir. Öte yandan, bir koku bir yazılım sisteminin kalitesini olumsuz etkileyen kötü bir uygulamadır. Örneğin, Singleton bir anti-desen ve Tanrı sınıfı (veya Yetersiz Modülerleştirme) bir tasarım kokusudur.


2

Anti-paternler, insanların yanlış bir şekilde veya en azından çok iyi olmayan bir şekilde programlama eğilimi gösteren yaygın yöntemlerdir.


0

Verilen yazılım geliştirme ortamına faydadan daha fazla zarar veren herhangi bir tasarım deseni anti-desen olarak kabul edilir.

Bazı anti-paternler açıktır, ancak bazıları değildir. Örneğin, Singleton, birçoğu eski tasarım desenini iyi görmesine rağmen, yapmayan başkaları da var.

Teklitonlar hakkında bu kadar kötü olan soruyu kontrol edebilirsiniz. farklı görüşleri daha iyi anlamak için.


Aslında, anti-paternler genellikle belirgin değildir. Açıkçası kötü tasarım kalıpları sadece kötü tasarım kalıplarıdır. Gerçek bir anti-desen yüzeyde tenable görünüyor, ancak daha sonra sorunları ortaya koyuyor. Aslında, açıkça kötü olmamak, onları ilk etapta bir anti-desen yapan ayrımdır.
Hawkeyegold

0

Algoritma'da olduğu gibi Brute force'i kullanarak çözüme ulaşabilirsiniz, ancak durum karmaşık hale gelirse çok fazla ödeme yapmanız gerekir.

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.