Martin'in kararlılık metriğini ve "kararlılık" ile ne anlama geldiğini unutmayın:
Instability = Ce / (Ca+Ce)
Veya:
Instability = Outgoing / (Incoming+Outgoing)
Yani, tüm bağımlılıkları giden bir paket tamamen kararsız olarak kabul edilir: başka şeyler kullanır, ancak hiçbir şey kullanmaz. Bu durumda, sadece o şeyin somut olması mantıklıdır. Ayrıca, başka hiçbir şey kullanmadığı için değiştirilmesi en kolay kod türü olacaktır ve bu nedenle kod değiştirilirse başka hiçbir şey kırılamaz.
Bu arada, bir veya daha fazla şey tarafından kullanılan bir paketle tam bir "istikrar" senaryosuna sahip olduğunuzda, ancak yazılım tarafından kullanılan merkezi bir paket gibi kendi başına bir şey kullanmıyorsa, Martin bu şeyin olması gerektiğini söylüyor Öz. Bu, temel olarak bağımlılıkların hem düşük hem de yüksek düzey kod için soyutlamalara eşit olarak akması gerektiğini belirten Bağımlılık Ters Çevirme Prensibi olan SOLI (D) DIP kısmı tarafından da güçlendirilmiştir.
Yani, bağımlılıklar eşit olarak "istikrara" doğru akmalı ve daha kesin olarak, bağımlılıklar giden bağımlılıklardan daha fazla bağımlılığa sahip paketlere doğru akmalı ve ayrıca bağımlılıklar soyutlamalara doğru akmalıdır. Bunun arkasındaki mantığın özü, soyutlamaların, bir alt tipi diğerine ikame etmek için nefes alma alanı sağlaması ve arabirimi uygulayan beton parçaların, soyut arabirime gelen bağımlılıkları bozmadan değişmesi için esneklik sunmasıdır.
Soyutlamalara bağlı olmanın önemli dezavantajları var mı?
Aslında, en azından benim alanım için Martin ile aynı fikirde değilim ve burada, "değişme nedenleri eksik" olduğu gibi, yeni bir "istikrar" tanımı getirmem gerekiyor. Bu durumda, bağımlılıkların istikrara doğru akması gerektiğini söyleyebilirim, ancak soyut arayüzler soyut arayüzler kararsızsa (Martin'in tekrar tekrar değişmeye eğilimli olduğu gibi, "kararsız" tanımımla) yardımcı olmaz. Geliştiriciler soyutlamaları düzeltemezse ve istemciler sürekli olarak yazılımı eksik veya etkisiz modelleme girişimlerini gerçekleştirecek şekilde fikirlerini değiştirirlerse, artık sistemi basamaklı bağımlılık kırıcı değişikliklere karşı korumak için soyut arabirimlerin gelişmiş esnekliğinden faydalanmıyoruz. . Kişisel durumumda, AAA oyunlarında bulunanlar gibi ECS motorları buldum,en somut : ham verilere doğru, ancak bu tür veriler son derece kararlıdır ("olduğu gibi," hiçbir zaman değiştirilmesi gerekmemektedir "). Gelecekteki değişikliklerin gerektirdiği bir şeyin, SE kararlarına rehberlik ederken efferent'in toplam kuplajlara oranından daha yararlı bir metrik olma olasılığını sıklıkla buldum.
Bu yüzden, DIP'yi biraz değiştirirdim ve sadece, bu bileşenlerin soyut arabirimler mi yoksa ham veri mi olduğuna bakılmaksızın, "bağımlılıklar daha fazla değişiklik gerektirme olasılığı en düşük bileşenlere doğru akmalıdır" diyorum. Benim için önemli olan, doğrudan tasarım kırma değişiklikleri gerektirme olasılığıdır. Soyutlamalar, yalnızca bir şey soyut olarak bu olasılığı azaltırsa, bu istikrar bağlamında faydalıdır.
Yazılımın ihtiyaçlarını önceden tahmin eden ve istikrarlı (değişmeyen) soyutlamalar tasarlayan iyi mühendisler ve müşteriler için geçerli olabilecek birçok bağlam için, bu soyutlamalar onlara somut uygulamaları değiştirmek için ihtiyaç duydukları tüm solunum odasını sunar. Ancak bazı alanlarda, soyutlamalar kararsız olabilir ve yetersiz olmaya eğilimli olabilirken, motor için gerekli verilerin önceden tahmin edilmesi ve kararlı hale getirilmesi çok daha kolay olabilir. Dolayısıyla, bu durumlarda, bağımlılıkların soyutlamalardan ziyade verilere doğru akması için sürdürülebilirlik açısından (sistemi değiştirme ve genişletme kolaylığı) aslında daha yararlı olabilir. Bir ECS'de en kararsız parçalar (en sık değiştirilen parçalarda olduğu gibi) tipik olarak sistemlerde (PhysicsSystem
örneğin), en kararlı parçalar (en azından değiştirilmesi muhtemel olan), sadece MotionComponent
tüm sistemlerin kullandığı ham verilerden ( örn.) oluşan bileşenlerdir .