Özellik Kesişimleriyle Başa Çıkma


11

Son zamanlarda , özellik kavşakları hakkındaki bu makalede açıklananlara benzer daha fazla soruna tanık oldum . Bunun için başka bir terim ürün grupları olacaktır, ancak bunları gerçekten farklı ürünlere atfetme eğilimindeyken, genellikle bu sorunlarla olası ürün yapılandırmaları şeklinde karşılaşıyorum.

Bu tür bir sorunun temel fikri basittir: Bir ürüne bir özellik eklersiniz, ancak mevcut diğer özelliklerin bir kombinasyonu nedeniyle işler bir şekilde karmaşıklaşır. Sonunda, KG, daha önce kimsenin düşünmediği nadir bir özellik kombinasyonu ile bir sorun bulur ve basit bir hata düzeltmesinin ne olması gerektiği bile büyük tasarım değişiklikleri gerektirebilir.

Bu özellik kavşak sorununun boyutları akıl almaz bir karmaşıklığa sahiptir. Mevcut yazılım sürümünün Nözelliklere sahip olduğunu ve yeni bir özellik eklediğinizi varsayalım . Ayrıca, özelliklerin her birinin yalnızca açılıp kapanabileceğini söyleyerek işleri basitleştirelim, o zaman 2^(N+1)dikkate almanız gereken özellik kombinasyonlarına zaten sahipsiniz . Daha iyi ifade / arama terimleri eksikliğinden dolayı, bu kombinasyonların varlığını özellik kavşak sorunu olarak adlandırıyorum . (Daha yerleşik bir terim için referans (lar) dahil bir cevap için bonus puanlar.)

Şimdi mücadele ettiğim soru, geliştirme sürecinin her seviyesinde bu karmaşıklık sorunuyla nasıl başa çıkılacağı. Açıkça görülen maliyet nedenlerinden ötürü, her kombinasyonu ayrı ayrı ele almak istemek, ütopya olma noktasına kadar pratik değildir. Sonuçta, iyi bir nedenden dolayı üstel karmaşıklık algoritmalarından uzak durmaya çalışıyoruz, ancak çok geliştirme sürecinin kendisini katlanarak boyutlandırılmış bir canavara dönüştürmek tamamen başarısızlığa yol açacak.

Öyleyse, herhangi bir bütçeyi patlatmayan ve iyi, yararlı ve profesyonel olarak kabul edilebilir bir şekilde tamamlanan sistematik bir şekilde en iyi sonucu nasıl elde edersiniz?

  • Özellikler: Yeni bir özellik belirttiğinizde - diğer tüm çocuklarla iyi oynatılmasını nasıl sağlarsınız?

    Birinin mevcut her bir özelliği yeni özellikle birlikte sistematik olarak inceleyebildiğini görebiliyorum - ancak bu diğer özelliklerin izolasyonunda olacaktı. Bazı özelliklerin karmaşık doğası göz önüne alındığında, bu izole görüş çoğu zaman zaten o kadar dahil olur ki, 2^(N-1)isteyerek göz ardı edilen diğer özelliklerin neden olduğu faktör hariç , kendi içinde yapılandırılmış bir yaklaşıma ihtiyaç duyar .

  • Uygulama: Bir özellik uyguladığınızda - kodunuzun her durumda düzgün bir şekilde etkileşmesini / kesişmesini nasıl sağlarsınız?

    Yine, karmaşıklığı merak ediyorum. Kesişen iki özelliğin hata potansiyelini azaltmak için çeşitli teknikler biliyorum, ancak hiçbiri makul bir şekilde ölçeklenemez. Bununla birlikte, şartname sırasında iyi bir stratejinin, uygulama sırasında problemi uzak tutması gerektiğini varsayıyorum.

  • Doğrulama: Bir özelliği test ettiğinizde - bu özellik kavşak alanının yalnızca bir kısmını test edebileceğiniz gerçeğiyle nasıl başa çıkıyorsunuz?

    Tek bir özelliği tek başına test etmenin, hatasız kod yakınında hiçbir yerde hiçbir şeyi garanti etmediğini bilmek yeterince zordur, ancak bunu bir kısmına 2^-Nindirdiğinizde yüzlerce test, tüm okyanuslarda tek bir damla suyu bile kaplamıyor gibi görünüyor. . Daha da kötüsü, en sorunlu hatalar, herhangi bir soruna yol açmayı beklemeyebilecek özelliklerin kesişiminden kaynaklanan hatalardır - ancak bu kadar güçlü bir kavşak beklemiyorsanız bunları nasıl test edersiniz?

Başkalarının bu sorunla nasıl başa çıktıklarını duymak isterim, ancak öncelikle konuyu daha derinlemesine inceleyen literatür veya makalelerle ilgileniyorum. Dolayısıyla, belirli bir stratejiyi kişisel olarak takip ederseniz, yanıtınıza karşılık gelen kaynakları dahil etmek iyi olur.


6
Hassas tasarımlı bir uygulama mimarisi, dünyayı tersine çevirmeden yeni özelliklere uyum sağlayabilir; deneyim burada büyük eşitlikçi olduğunu. Bununla birlikte, böyle bir mimarinin ilk denemede doğru olması her zaman kolay değildir ve bazen zor ayarlamalar yapmanız gerekir. Test problemi, özellikleri ve işlevselliği düzgün bir şekilde nasıl kapsülleyeceğinizi ve bunları yeterli birim testleriyle nasıl kapatacağınızı biliyorsanız, bunu yapmak istediğiniz bataklık değildir.
Robert Harvey

Yanıtlar:


6

Bir programın doğrulanmasının, en genel durumda, durdurma problemi nedeniyle, sınırlı bir zamanda imkansız olduğunu zaten matematiksel olarak biliyorduk. Yani bu tür bir sorun yeni değil.

Uygulamada, iyi tasarım, kesişen özelliklerin sayısının 2 ^ N'den daha az olacağı şekilde ayrıştırmayı sağlayabilir, ancak iyi tasarlanmış sistemlerde bile kesinlikle N'nin üzerinde gibi görünmektedir.

Kaynaklara göre, yazılım tasarımı ile ilgili hemen hemen her kitap veya blogun bu 2 ^ N'yi mümkün olduğunca azaltmaya çalıştığı görülüyor, ancak sorunu sizinle aynı terimlerle ifade eden herhangi bir şey bilmiyorum. yapmak.

Tasarımın buna nasıl yardımcı olabileceğine ilişkin bir örnek için, bahsedilen makalede, eTag'in çoğaltılması ve dizine eklenmesi tetiklendiğinden özellik kavşağının bir kısmı gerçekleşti. Bunların her birine ayrı ayrı ihtiyaç duyulduğunu gösteren başka bir iletişim kanalı olsaydı, o zaman muhtemelen olayların sırasını daha kolay kontrol edebilir ve daha az sorun yaşayabilirlerdi.

Ya da belki de değil. RavenDB hakkında hiçbir şey bilmiyorum. Mimari, gerçekten açıklanamaz bir şekilde iç içe geçmişse, özellik kavşak sorunlarını önleyemez ve önceden bilemeyiz, en kötü 2 ^ N kavşağa sahip bir özellik istemeyiz. Ancak mimari en azından uygulama sorunları nedeniyle kesişimleri sınırlandırabilir.

RavenDB ve eTag'ler hakkında yanılmış olsam bile (ve sadece tartışma uğruna kullanıyorum - akıllı insanlar ve muhtemelen doğru anladım), mimarlığın nasıl yardımcı olabileceği açık olmalı . İnsanların bahsettiği desenlerin çoğu, yeni veya değişen özelliklerin gerektirdiği kod değişikliklerinin sayısını azaltmak amacıyla açıkça tasarlanmıştır. Bu geri gider - örneğin "Tasarım Desenleri, Yeniden Kullanılabilir Nesne Odaklı Yazılım Öğeleri", giriş "Her tasarım deseni mimarinin bazı yönlerinin diğer yönlerden bağımsız olarak değişmesine izin verir, böylece bir sistemi belirli bir tür değişiklik".

Demek istediğim, pratikte neler olduğuna bakarak, uygulamadaki özellik kavşaklarının büyük O'sunu anlayabiliriz. Bu yanıtı araştırırken, fonksiyon noktaları / geliştirme çabasının (yani - üretkenlik) analizinin çoğunun , ya fonksiyon noktası başına proje çabasının doğrusal büyümesinden daha az ya da doğrusal büyümenin biraz üzerinde olduğunu buldum . Biraz şaşırtıcı buldum. Bunun oldukça okunabilir bir örneği vardı.

Bu (ve bazıları kod satırları yerine işlev noktaları kullanan benzer çalışmalar), özellik kavşağının meydana gelmediğini ve sorunlara neden olmadığını kanıtlamaz, ancak pratikte yıkıcı olmadığına dair makul bir kanıt gibi görünmektedir.


0

Bu hiçbir şekilde en iyi cevap olmayacak, ancak sorunuzdaki puanlarla kesişen bazı şeyleri düşünüyorum, bu yüzden onlardan bahsettiğimi düşündüm:

Yapısal destek

Gördüğüm kadarıyla, özellikler buggy olduğunda ve / veya başkalarıyla iyi bağlanmadığında, büyük ölçüde bunları yönetmek / koordine etmek için programın çekirdek yapısı / çerçevesi tarafından sağlanan zayıf destek nedeniyle. Bence daha fazla zaman harcamak ve çekirdeği yuvarlamak, yeni özelliklerin eklenmesini kolaylaştırmalıdır.

Çalıştığım uygulamalarda yaygın olarak bulduğum bir şey, bir programın yapısının bir tür nesne veya süreçten birini işlemek için kurulduğu , ancak yaptığımız veya yapmak istediğimiz birçok uzantı türünün çoğunu ele almakla ilgilidir. Bu, uygulamanın tasarımının başlangıcında daha fazla dikkate alınsaydı, daha sonra bu özelliklerin eklenmesine yardımcı olurdu.

Dişli / asenkron / olay güdümlü kod içeren birden fazla X için destek eklerken bu oldukça kritik hale gelir, çünkü bu şeyler oldukça hızlı bir şekilde kötüleşebilir - Bununla ilgili bir dizi sorunu ayıklama sevincim oldu.

Yine de, özellikle prototipler veya bir kerelik projeler için bu tür çabaları haklı çıkarmak zordur - bu prototiplerden veya bir kereliklerden bazıları tekrar veya son sistem olarak kullanılmaya devam etse de, yani harcama uzun vadede buna değecekti.

tasarlamak

Bir programın çekirdeğini tasarlarken, yukarıdan aşağıya bir yaklaşımla başlamak işleri yönetilebilir parçalara dönüştürmeye yardımcı olabilir ve başınızı sorunlu etki alanının etrafına sarmanıza izin verir; Bundan sonra, aşağıdan yukarıya bir yaklaşımın kullanılması gerektiğini düşünüyorum - bu, işleri daha küçük, daha esnek ve daha sonra eklemek için daha iyi hale getirmeye yardımcı olacaktır. (Bağlantıda belirtildiği gibi, şeyleri bu şekilde yapmak, özelliklerin daha küçük uygulamaları için daha az çatışma / hata anlamına gelir.)

Sistemin temel yapı taşlarına odaklanır ve hepsinin iyi etkileşime girdiğinden emin olursanız, bunları kullanarak inşa edilen her şey muhtemelen iyi davranır ve sistemin geri kalanıyla daha iyi bütünleşmelidir.

Yeni bir özellik eklendiğinde, çerçevenin geri kalanını tasarlarken aldığı gibi benzer bir yol izlenebileceğini düşünüyorum: ayrıştırmak ve sonra aşağıdan yukarıya gitmek. Özelliği uygularken çerçevedeki orijinal bloklardan herhangi birini yeniden kullanabiliyorsanız, bu kesinlikle yardımcı olacaktır; işiniz bittiğinde, özellikten aldığınız yeni blokları zaten temel çerçevede olanlara ekleyebilir, orijinal blok kümesiyle test edebilirsiniz - bu şekilde sistemin geri kalanıyla uyumlu olacak ve gelecekte kullanılabilir özellikleri de.

Basitleştirin!

Sorunun basitleştirilmesinden sonra çözümün basitleştirilmesinden başlayarak geç tasarım konusunda minimalist bir duruş sergiliyorum. Bir proje için tasarım yinelemesini basitleştirerek bir saniye sürebilirse, daha sonra bir şeyler eklerken bunun çok yararlı olduğunu görebiliyordum.

Her neyse, bu benim 2c.

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.