Kullanıcı arayüzünden dekuplaj sınıfları


27

Kullanıcı arayüzü hakkında bilmek zorunda kalabilecekleri sınıflar yazarken en iyi uygulama nedir. Nasıl çizileceğini bilen bir sınıf, kullanıcı arabiriminin ne olduğuna (konsol, GUI, vb.) Bağlı olduğundan en iyi uygulamaları nasıl bozacağını bilemez mi?

Birçok programlama kitabında kalıtım gösteren “Şekil” örneğiyle karşılaştım. Temel sınıf şekli, her bir daire ve kare gibi geçersiz kılan bir draw () yöntemine sahiptir. Bu polimorfizm sağlar. Ancak draw () yöntemi kullanıcı arayüzünün ne olduğuna bağlı değil mi? Bu sınıfı Win Forms için yazarsak, konsol uygulaması veya web uygulaması için tekrar kullanamayız. Bu doğru mu?

Sorunun nedeni kendimi daima sıkışıp kalırken sınıfları nasıl yaygınlaştıracağım ve böylece en yararlı olmaları için kapatıyorum. Bu aslında bana karşı çalışıyor ve "çok çalışıyorum" olup olmadığını merak ediyorum.


Neden ayrıştırmak istiyorsun? Çünkü bunun doğru bir şey olduğunu duydunuz ya da başka nedenleriniz var mı?
SoylentGray

2
“Kendini nasıl çizeceğini bilen” sınıfının tamamı, keşke kaybolacağım korkunç, eski bir örnek. Özellikle oyun programcısının yığında =)
Patrick Hughes

2
@Chad gerçekten okul dışında pek deneyimli değilim. Kitap okudum ve gerçekten tasarım kalıpları ve en iyi uygulamalar hakkında yeni şeyler öğrenmek ve okumaktan hoşlanıyorum. Yani evet, dekuplajın iyi olduğunu duyduğumu söyleyebilirim ama aynı zamanda mantıklı. Örneğin, bir masaüstü WinForms uygulaması için kullanabileceğim bir kod yazmak istiyorum, daha sonra bu kodu alıp bir web sitesi veya bir silverlight uygulaması için mümkün olduğunca tekrar kullanın.
Pete,

@Pete - Bu iyi bir cevap.
SoylentGray

2
@Patrick: Dürüst olmak gerekirse, eğer bir Shapesınıf yazıyorsanız , o zaman büyük olasılıkla bir grafik yığını için bir müşteri yazmak yerine, grafik yığınını yazıyorsunuzdur.
Ken Bloom,

Yanıtlar:


13

Kullanıcı arayüzü hakkında bilmek zorunda kalabilecekleri sınıflar yazarken en iyi uygulama nedir. Nasıl çizileceğini bilen bir sınıf, kullanıcı arabiriminin ne olduğuna (konsol, GUI, vb.) Bağlı olduğundan en iyi uygulamaları nasıl bozacağını bilemez mi?

Bu sınıfa ve kullanım durumuna bağlıdır. Kendisinin nasıl çizileceğini bilen görsel bir unsur mutlaka tek bir sorumluluk ilkesinin ihlali değildir.

Birçok programlama kitabında kalıtım gösteren “Şekil” örneğiyle karşılaştım. Temel sınıf şekli, her bir daire ve kare gibi geçersiz kılan bir draw () yöntemine sahiptir. Bu polimorfizm sağlar. Ancak draw () yöntemi kullanıcı arayüzünün ne olduğuna bağlı değil mi?

Yine, mutlaka değil. Bir arabirim oluşturabilirseniz (drawPoint, drawLine, set Color vb.), Şeyleri şekle bir şey üzerine çizmek için herhangi bir bağlamı, örneğin şeklin yapıcısının içinde geçirebilirsiniz. Bu, şekillerin kendilerini bir konsola veya verilen herhangi bir tuvale çizmelerini sağlar.

Bu sınıfı Win Forms için yazarsak, konsol uygulaması veya web uygulaması için tekrar kullanamayız. Bu doğru mu?

Bu doğru. Windows Forms için bir UserControl (genel olarak bir sınıf değil) yazarsanız, bunu bir konsolla kullanamazsınız. Ama bu bir problem değil. Windows Formları için bir UserControl'ün neden herhangi bir sunumla çalışmasını beklersiniz? UserControl bir şey yapmalı ve iyi yapmalı. Tanım olarak belli bir sunum biçimine bağlıdır. Sonunda, kullanıcının bir şeye ihtiyacı var: bir soyutlamaya değil. Bu sadece çerçeveler için kısmen doğru olabilir, fakat son kullanıcı uygulamaları için geçerlidir.

Bununla birlikte, arkasındaki mantık ayrıştırılmalıdır, böylece diğer sunum teknolojilerinde tekrar kullanabilirsiniz. Uygulamanız için dikgenliği korumak için gerektiğinde arayüzleri tanıtın. Genel kural şudur: Somut şeyler, diğer somut şeylerle değiştirilebilir olmalıdır.

Sorunun nedeni kendimi daima sıkışıp kalırken sınıfları nasıl yaygınlaştıracağım ve böylece en yararlı olmaları için kapatıyorum. Bu aslında bana karşı çalışıyor ve "çok çalışıyorum" olup olmadığını merak ediyorum.

Biliyorsunuz, aşırı programcılar YAGNI tutumlarına düşkünler . Her şeyi genel olarak yazmaya çalışmayın ve her şeyi genel amaç haline getirmeye çalışmak için fazla çaba harcamayın. Buna mühendisliğe denir ve sonunda tamamen düzenlenmiş koda yol açar. Her bileşene tam olarak bir görev verin ve iyi yaptığından emin olun. Gerektiğinde değişmeleri beklediğiniz yerlerde gerekli soyutlamaları yapın (örneğin, yukarıda belirtildiği gibi çizim bağlamı için arayüz).

Genel olarak, iş uygulamaları yazarken her zaman bir şeyleri ayırmaya çalışmalısınız. MVC ve MVVM, mantığı sunumdan ayırmak için harikadır, böylece bir web sunumu veya bir konsol uygulaması için yeniden kullanabilirsiniz. Sonunda bazı şeylerin somut olması gerektiğini unutmayın. Kullanıcılarınız bir soyutlama ile çalışamazlar, somut bir şeye ihtiyaçları vardır. Soyutlamalar, yalnızca kodun genişletilebilir ve bakımı yapılabilir olması için programcı sizin için yardımcıdır. Esnek olmak için kodunuzun nereye ihtiyaç duyduğunuzu düşünmeniz gerekir. Sonunda tüm soyutlamalar somut bir şey doğurmak zorunda.

Düzenleme: En iyi uygulamaları sağlayabilecek mimari ve tasarım teknikleri hakkında daha fazla okumak istiyorsanız, @Catchops yanıtını ve wikipedia'daki SOLID uygulamaları hakkındakileri okumanızı öneririm .

Ayrıca, yeni başlayanlar için her zaman aşağıdaki kitabı öneririm: Head First Design Patterns . GoF kitabından çok daha fazla olan soyutlama tekniklerini / OOP tasarım uygulamalarını anlamanıza yardımcı olacaktır (ki bu mükemmel, sadece yeni başlayanlar için uygun değildir).


1
İyi cevap, ancak aşırı programcılar ' şeylerin değişmesini beklediğimiz soyutlamaları koymazlar'. Biz şeyler soyutlamalarda koymak edilir kodu KURU, değişen.
kevin cline

1
Önceki davranış ve arayüzlere uyması gereken bir API'ye sahip herkese açık bir kütüphane tasarlamadığınız sürece, kevin cline bu harika.
Magnus Wolffelt

@Magnus - evet, bazı dillerde kitaplık tasarlamak, geriye dönük ikili uyumluluk için planlama yapmak zordur. Birisi gelecekteki genişletmeye izin vermek için şu anda gerekli olmayan her türlü kodu yazmak zorunda kalır. Bu, metali derleyen diller için uygun olabilir. Sanal makineyi derleyen diller için aptalca.
kevin cline '

19

Kesinlikle haklısın. Ve hayır, "gayet iyi çalışıyorsun" :)

Tek sorumluluk ilkesi hakkında bilgi edinin.

Sınıf içi çalışmanız ve bu bilgilerin kullanıcıya sunulması gereken iki sorumluluktur.

Sınıfları ayırmaktan korkma. Nadiren sorun çok fazla soyutlama ve ayrılmadır :)

Çok ilgili iki model web uygulamaları için Model-view-kontrolör ve Silverlight / WPF için Model View ViewModel'dir .


1
+1 Web dışı uygulamalar için MVC'yi bile kullanabilirsiniz, en azından sorumlulukları açık tutmanız açısından düşünmenize yardımcı olur.
Patrick Hughes,

MVVM, MVC'ye silimar'tır. MVC, çoğunlukla web uygulamaları gibi durumsuz uygulamalar içindir.
Boris Yankov

3
-1 Tecrübelerime göre en yaygın sorunlardan biri erken genelleme ve genel olarak aşırı mühendisliktir.
dietbuddha

3
Öncelikle bir şeyi nasıl geliştireceğinizi bilmeniz gerekir. Deneyimlerime göre, insanlar 'mühendis mühendisliği' yazılımı çok daha sık.
Boris Yankov

Yazılım tasarımını geliştirme çabalarını takdir ederken, bir sınıftaki bir aramayı bir arabirimde bir aramanın yerine koymak hiçbir şeyi anlamsal olarak ayırmaz. Dinamik olarak yazılmış bir dil kullanırken ne olacağını düşünün. Yığın değişiminin programcıları bölümünde verilen tavsiyede, yüzeysel (sözdizimsel) ayrıştırmaya ve gerçek ayrıştırmaya çok az vurgu yapılmaktadır.
Frank Hileman

7

MVVM'yi çok fazla kullanıyorum ve benim görüşüme göre, bir işletme nesnesi sınıfının kullanıcı arayüzü hakkında hiçbir şey bilmesi gerekmiyor. Elbette SelectedItem, veya IsChecked, veya IsVisible, vb'yi bilmeleri gerekebilir ancak bu değerlerin belirli bir UI'ye bağlanması gerekmemektedir ve sınıfta genel özellikler olabilir.

Odak ayarı, Animasyon çalıştırma, Kısayol Tuşları, vb. İşlemlerini yapmak için arka plandaki arabirimde bir şey yapmanız gerekiyorsa, kod iş mantık sınıflarınıza değil, kullanıcı arabiriminin arka plan kodunun bir parçası olmalıdır.

Yani, kullanıcı arayüzünüzü ve sınıflarınızı ayırmaya çalışmaktan vazgeçme derim. Ne kadar ayrılırlarsa, bakımı ve deneyi o kadar kolay olurlar.


5

Yıllarca tam olarak neden bahsettiğinizi ele almak için geliştirilen denenmiş ve gerçek tasarım desenleri vardır. Sorunuza verilen diğer cevaplar, Tek Geçerli Sorumluluk İlkesine (kesinlikle geçerli olan) ve sorunuzu yönlendiren şeylere atıfta bulundu . Bu ilke, bir sınıfın bir şeyi WELL yapması gerektiğini belirtir. Başka bir deyişle, Uyumluluk ve alçaltmanın arttırılması, nesne yönelimli tasarımın iyi olduğu şeydir - bir sınıf iyi bir şey yapar ve başkalarına çok fazla bağımlılığı olmaz.

Şey ... bir iPhone'da daire çizmek istiyorsanız, Windows çalıştıran bir bilgisayarda çizmekten farklı olacağını gözlemlemekte haklısınız. (Bu durumda) iPhone'da birisini iyi, diğeri de PC'de iyi bir şekilde çizen somut bir sınıfa sahip olmalısınız. Bu, temel OO mirasının, bu şekil örneklerinin hepsinin parçalandığı yerdir. Bunu sadece mirasla yapamazsınız.

Arayüzlerin devreye girdiği yer burasıdır - Dört kitabın Çetesi olarak belirtilir (OKUYUN) - Her zaman miras yerine uygulamayı tercih edin. Başka bir deyişle, çeşitli kodları zor kodlanmış bağımlılıklara dayanmadan gerçekleştirebilen bir mimariyi bir araya getirmek için arayüzleri kullanın.

SOLID prensiplerine referans aldım . Bunlar harika. 'S' tek sorumluluk ilkesidir. AMA, 'D' Bağımlılık İnversiyonu anlamına gelir. Kontrol deseninin ters çevrilmesi (Bağımlılık Enjeksiyonu) burada kullanılabilir. Çok güçlüdür ve bir iPhone için olduğu kadar PC için de bir daire çizebilecek bir sistemin nasıl inşa edileceği sorusuna cevap vermek için kullanılabilir.

Ortak iş kuralları ve veri erişimi içeren bir mimari oluşturmak mümkündür, ancak bu yapıları kullanan çeşitli kullanıcı arayüzleri uygulamaları vardır. Bununla birlikte, gerçekte, onu uygulayan bir ekipte bulunmak ve onu gerçekten anlamak için eylemde görmek gerçekten yardımcı olur.

Bu, daha ayrıntılı bir cevabı hak eden bir soruya verilen hızlı ve üst düzey bir cevaptır. Bu kalıplara daha fazla bakmanızı tavsiye ediyorum. Bu patlayıcıların biraz daha somut uygulaması, MVC ve MVVM'nin iyi bilinen isimleri olarak bulunabilir.

İyi şanslar!


Birisi nedenine dair bir yorum yapmadan bir şeyi reddettiğinde onu seviyorum (tabi ki alaycılık). Belirttiğim prensipler doğrudur - düşürücü lütfen ayağa kalkar ve nedenini söyler mi?
Catchops

2

Kullanıcı arayüzü hakkında bilmek zorunda kalabilecekleri sınıflar yazarken en iyi uygulama nedir.

Nasıl çizileceğini bilen bir sınıf, kullanıcı arabiriminin ne olduğuna (konsol, GUI, vb.) Bağlı olduğundan en iyi uygulamaları nasıl bozacağını bilemez mi?

Bu durumda, hala MVC / MVVM'yi kullanabilir ve ortak arayüzü kullanarak farklı UI uygulamaları enjekte edebilirsiniz:

public interface IAgnosticChartDrawing
{
   public void Draw(ChartProperties chartProperties);
   event EventHandler ChartPanned;
}

public class GuiChartDrawer : UserControl, IAgnosticChartDrawing
{
    public void Draw(ChartProperties chartProperties)
    {
        //GDI, GTK or something else...
    }

    //Implement event based on mouse actions
}

public class ConsoleChartDrawer : IAgnosticChartDrawing
{
    public void Draw(ChartProperties chartProperties)
    {
        //'Draw' using characters and symbols...
    }

    //Implement event based on keyboard actions
}

IAgnosticChartDrawing guiView = new GuiChartDrawer();
IAgnosticChartDrawing conView = new ConsoleChartDrawer();

Model model = new FinancialModel();

SampleController controllerGUI = new SampleController(model, guiView);
SampleController controllerConsole = new SampleController(model, conView);

Bu şekilde, yeni GUI türleri eklerken Denetleyici ve Model mantığınızı yeniden kullanabileceksiniz.


2

Bunu yapmak için farklı modeller var: MVP, MVC, MVVM, vb ...

Martin Fowler'ın (büyük isim) okunması güzel bir yazı GUI Mimarileri: http://www.martinfowler.com/eaaDev/uiArchs.html

MVP'den henüz bahsedilmedi, ancak kesinlikle gösterilmeyi hak ediyor: bir göz atın.

Bu, Google Web Toolkit geliştiricileri tarafından kullanılması önerilen yöntemdir.

Bu yaklaşımın neden kullanışlı olduğuna dair gerçek kod, gerçek örnekler ve gerekçeleri burada bulabilirsiniz:

http://code.google.com/webtoolkit/articles/mvp-architecture.html

http://code.google.com/webtoolkit/articles/mvp-architecture-2.html

Bu konuda yeterince vurgulanmamış bu veya benzeri yaklaşımları izlemenin avantajlarından biri de test edilebilirlik! Birçok durumda bunun en büyük avantaj olduğunu söyleyebilirim!


1
Bağlantılar için +1. MSDN'de MVVM hakkında benzer bir makale okuyordum ve bu google makaleleri biraz farklı olsa da çok daha iyi.
Pete,

1

Bu cepten yerlerden biridir başarısız soyutlama iyi bir iş yapmak. OOP polimorfizmi, tek bir değişken ('this') üzerinden dinamik gönderim kullanır. Polimorfizm Şekil'de kök salmışsa, oluşturucu üzerinde polimorfik-müttefiki gönderemezsiniz (konsol, GUI vb.).

İki veya daha fazla değişkeni gönderebilecek bir programlama sistemi düşünün:

poly_draw(Shape s, Renderer r)

ve sistemin, çeşitli Şekil türleri ve Renderer türleri kombinasyonları için poly_draw komutunu ifade etmenin bir yolunu verebileceğini varsayalım. O zaman doğru şekil ve render sınıflandırma ile gelip kolay olurdu? Tip denetleyicisi bir şekilde anlamanıza yardımcı olur, uygulamayı kaçırmış olabileceğiniz şekil ve oluşturucu kombinasyonlarının olduğunu.

Çoğu OOP dili yukarıdaki gibi bir şeyi desteklemez (birkaçı yapar, ancak ana dilde değildir). Bir geçici çözüm için Ziyaretçi şablonuna bir göz atmanızı öneririm .


1

... draw () yöntemi kullanıcı arayüzünün ne olduğuna bağlı değil mi? Bu sınıfı Win Forms için yazarsak, konsol uygulaması veya web uygulaması için tekrar kullanamayız. Bu doğru mu?

Yukarıdaki sesler bana doğru geliyor. Anladığım kadarıyla, MVC tasarım deseni açısından Kontrolör ve Görünüm arasında nispeten sıkı birleşme olduğu söylenebilir. Bu, aynı zamanda masaüstü konsolu-webapp arasında geçiş yapmanın, hem Denetleyici hem de Görüntülemeyi bir çift olarak değiştirmesi gerektiği anlamına gelir - sadece bir model değişmeden kalır.

... Kendimi daima sık sık sıkışıp kalırken sınıfları nasıl yaygınlaştıracağım ve böylece en yararlı olmaları için kapatıyorum.

Benim şu anki üstesinden geldiğim, bahsettiğimiz bu View-Controller eşlemesinin tamam olduğu ve hatta daha fazlası, modern tasarımda oldukça popüler olduğu.

Olsa da, bir iki yıl önce de bu konuda kendimi güvensiz hissettim. Sun forumunda desenler ve OO tasarımı üzerine tartışmalar yaptıktan sonra fikrimi değiştirdim.

Eğer ilgileniyorsanız, bu forumu kendiniz deneyin - şimdi Oracle'a geçmiştir ( bağlantı ). Oraya gelirseniz, Saish'e ping atmayı deneyin - o zamanlar, bu zor konularla ilgili açıklamaları bana çok yardımcı oldu. Hala katılıyorsa söyleyemem - kendim uzun zamandır orada değildim


1

Ancak draw () yöntemi kullanıcı arayüzünün ne olduğuna bağlı değil mi?

Pragmatik bir bakış açısına göre, sisteminizdeki bazı kodların Rectanglekullanıcı sonu gereksinimi olan bir şey gibi nasıl çizileceğini bilmesi gerekir. Ve bu, bir noktada, pikselleri rasterleştirmek veya bir konsolda bir şey görüntülemek gibi gerçekten düşük seviyeli şeyler yapmaktan kaynaklanacak.

Birleşme açısından benim için soru , bu tür bilgilere kime / neye ve hangi dereceye kadar ayrıntıya (ne kadar soyut, örneğin) dayanmalıdır?

Soyut Çizim / Render Yetenekleri

Çünkü, üst seviye çizim kodu sadece çok soyut olan bir şeye bağlıysa, bu soyutlama, hedeflemeyi düşündüğünüz tüm platformlarda (somut uygulamaların kullanılmasıyla) çalışabilir. Tartışmalı bir örnek olarak, bazı çok soyut IDrawerarabirimler hem konsol hem de GUI API'lerinde arsa şekilleri gibi şeyler yapabilme yeteneğine sahip olabilir (konsol uygulaması konsola ASCII sanatı ile 80xN "resim" gibi davranabilir). Tabii ki bu, tartışmalı bir örnek çünkü yapmak istediğiniz genellikle bu değil, bir görüntü / çerçeve tamponu gibi bir konsol çıktısını ele almak; genellikle çoğu kullanıcı sonu gereksinimi, konsollarda daha fazla metin tabanlı etkileşimi gerektirir.

Bir diğer husus, istikrarlı bir soyutlama tasarlamanın ne kadar kolay olduğu? Çünkü hedeflediğiniz her şey modern GUI API'leri ise, çizgi çizme, dikdörtgenler, yollar, metin, bu tür şeyleri (sınırlı bir ilkel kümesinin basit 2D rasterleştirilmesi) gibi temel şekil çizme yeteneklerini ortadan kaldırmak için kolay olabilir. , hepsi için çeşitli alt tipler üzerinden kolayca ve düşük maliyetle uygulanabilen tek bir arayüz ile. Eğer böyle bir soyutlamayı etkili bir şekilde tasarlayabilir ve tüm hedef platformlara uygulayabilirseniz, o zaman çok daha az bir kötülük, bir kötülük olsa bile, bir şekil veya GUI kontrolü için ya da böyle bir kullanarak kendini nasıl çizeceğini bilmek için söyleyeceğim. soyutlama.

Ancak, ihtiyaçlarınız her biri için en modern gerçek zamanlı 3D renderleme / gölgeleme tekniklerini kullanmak iken Playstation Portable, iPhone, XBox One ve güçlü oyun bilgisayarı arasında değişen kanlı ayrıntıları soyutlamaya çalışıyorsunuz. . Bu durumda, temel donanım yetenekleri ve API'ler bu kadar çılgınca değiştiğinde oluşturma ayrıntılarını soyutlamak için soyut bir arayüz bulmaya çalışırken, zamanın büyük olasılıkla tasarımı ve yeniden tasarlanması, kesin olarak tekrarlanan tasarım olasılıkları beklenmedik bir şekilde değişebilir. keşifler ve aynı şekilde, temel donanımın bütün benzersizliğinden ve gücünden faydalanamayan en düşük ortak payda çözümü.

Bağımlılıkların Kararlı, "Kolay" Tasarımlara Doğru Akışı

Kendi alanımda bu son senaryodayım. Radikal olarak farklı temel yetenekleri ve API'leri olan çok sayıda farklı donanımı hedefliyoruz ve hepsine hükmetmek için tek bir renderleme / çizim soyutlaması bulmaya çalışmak sınırsızdır umutsuz (sadece bir oyun gibi etkili bir şekilde yaparak dünyaca ünlü olabiliriz) sektöründe değiştirici). Yani benim durumumda en son istediğim şey analog gibi Shapeya Modelda Particle Emitterbu çizimi mümkün olduğu kadar en üst düzeyde ve en soyut şekilde ifade etse bile, kendini nasıl çizeceğini biliyor ...

... çünkü bu soyutlamalar doğru tasarlanamayacak kadar zor, ve bir tasarımın doğru olması zor ve her şey buna bağlı olduğu zaman, buna bağlı olarak her şeyi kopartan ve parçalayan en pahalı merkezi tasarım değişikliklerinin bir reçetesi. Bu nedenle, istediğiniz son şey, sistemlerinizdeki bağımlılıkların, soyut tasarımlara doğru gelemeyecek kadar zor (akıcı değişiklikler olmadan dengelenmek için çok zor) olmasıdır.

Zor Kolay Bağımlıdır, Kolay Değil Zor Bağımlıdır

Öyleyse yaptığımız şey, bağımlılıkların tasarımı kolay olan şeylere doğru akmasını sağlamak. Çokgenler ve materyaller gibi şeyleri depolamaya odaklanan soyut bir “Model” tasarlamak ve bu tasarımı doğru yapmaktan çok daha kolaydır; bir PC'den PSP kadar farklı olan donanım için düzenli olarak talep eder.

görüntü tanımını buraya girin

Bu yüzden bağımlılıkları, tasarımı zor olan şeylerden uzaklaştırıyoruz. Soyut modeller yapmak yerine, kendilerini tümüyle bağlı oldukları bir soyut işleyici tasarımına nasıl çekeceklerini bilmek (ve bu tasarım değişirse uygulamalarını bozmak) yerine, sahnemizdeki her soyut nesneyi nasıl çizeceğini bilen soyut bir işleyicimiz var ( modeller, partikül yayıcılar, vb.) ve böylece RendererGl, bir başka PSP'ler için RendererPsp, başka bir cep telefonu vb. gibi PC'ler için bir OpenGL oluşturucu alt tipi uygulayabiliriz . işleyiciden sahnedeki çeşitli varlık türlerine (modeller, parçacıklar, dokular vb.), tersi olmaz.

görüntü tanımını buraya girin

  • Bob Amca'nın afferent / efferent coupling metriklerinden biraz farklı bir anlamda "stabilite / dengesizlik" kullanıyorum, ki bu anlayabildiğim kadarıyla değişimin zorluğunu ölçüyor. Stabilite metriği orada faydalı olmasına rağmen, “değişim gerektirme olasılığı” hakkında daha fazla konuşuyorum. "Değişim olasılığı", "değişim kolaylığı" ile orantılı olduğunda (örneğin: değişiklik gerektirmesi muhtemel olan şeyler, Bob Amca'nın metriğindeki en yüksek kararsızlığa ve afferent bağlantılara sahipse), bu tür olası değişikliklerin yapılması ucuz ve müdahaleci olmayan herhangi bir merkezi tasarıma dokunmadan yalnızca bir uygulamanın değiştirilmesini gerektirir.

Kendinizi merkez üssünüzde merkezi bir seviyeden soyutlamaya çalışıyorsanız ve inatla kafaları duvarlara çarpmak yerine sürekli tasarlamak zordur ve her ay / yılda sürekli olarak 8.000 kaynak dosyanın güncellenmesini gerektiren izinsiz değişiklikler yapmak ona bağlı olan her şeyi kırmak, benim bir numaralı önerim bağımlılıkları tersine çevirmeyi düşünmektir. Kodları, tasarımı zor olan şeyin tasarlanması zor olan şeylere bağlı olarak değil, tasarımı daha kolay olan her şeye bağlı olacak şekilde yazıp yazamayacağınıza bakın. Tasarımlardan (özellikle arayüz tasarımlarından) bahsettiğimi ve uygulamalardan bahsetmediğimi not edin: bazen tasarımları kolay ve uygulaması zor, ve bazen işleri tasarlamak zordur ancak uygulaması kolaydır. Bağımlılıklar tasarımlara doğru akar, bu nedenle odak noktası, bağımlılıkların akış yönünü belirlemek için burada bir şey tasarlamanın ne kadar zor olduğuna odaklanmalıdır.

Tek Sorumluluk İlkesi

Bana göre SRP burada genellikle çok ilginç değil (içeriğe bağlı olsa da). Demek istediğim, net ve korunabilir şeyler tasarlamada ipler dengeleyici bir hareket Shapevar ama nesnelerin nasıl çizileceğini bilmiyorlarsa nesnelerinizin daha ayrıntılı bilgi vermesi gerekebilir ve örneğin çok anlamlı şeyler olmayabilir. belirli bir kullanım bağlamında, onu yapılandırmaktan başka bir şekilde yapmak ve çizmek. Hemen hemen her konuda takaslar var ve bazı bağlamlarda deneyimlerime göre kendilerini böyle bir bakım kabusu haline getirebilecek şeyleri fark etmelerini sağlayacak SRP ile ilgili değil.

Bağlama ve bağımlılıkların sisteminizde aktığı yönle ilgili çok daha fazla şey var. Her şeyin bağlı olduğu soyut bir oluşturma arabirimini yeni bir hedef API / donanıma (çünkü kendilerini çizmek için kullandıkları için) taşımaya çalışıyorsanız ve orada etkin bir şekilde çalışmasını sağlamak için tasarımını önemli ölçüde değiştirmeniz gerektiğini fark ediyorsanız, o zaman Bu, sisteminizde, kendilerini nasıl çizeceklerini bilen her şeyin uygulamasının değiştirilmesini gerektiren çok pahalı bir değişikliktir. Ve bu, doğru şekilde önceden tasarlanması çok zor olan soyutlamalara doğru akan bir bağımlılık yüküne karşılık gelirse, kendilerini nasıl çizeceklerinin farkında olan şeylerle karşılaştığım en pratik bakım konusu.

Geliştirici Gururu

Bu noktadan bahsediyorum çünkü deneyimlerime göre, bu genellikle tasarımların bağımlılığı yönünü daha kolay olan şeylere doğru yönlendirmenin önündeki en büyük engeldir. Geliştiricilerin burada biraz hırslı olması ve “Platformlar arası soyutlama soyutlamalarını hepsine hükmedecek şekilde tasarlayacağım, diğer geliştiricilerin aylarca harcadığı şeyi çözeceğim ve alacağım çok kolay ” dedi. bu doğru ve desteklediğimiz her platformda sihir gibi çalışacak ve her biri için son teknoloji ürünü oluşturma tekniklerini kullanacak, zaten kafamda düşündüm. "Bu durumda, bunu yapmaktan kaçınmak ve sadece bağımlılıkların yönünü çevirmek ve uygulamada basitçe ucuz ve yerel yinelenen değişikliklere nihayetinde pahalı ve yinelenen merkezi tasarım değişikliklerini çevirmek için pratik çözüme direnirler. Böyle bir soyut seviyeye tasarım yapmak ve tüm stratejisini yeniden gözden geçirmek zor bir şey olduğunda, geliştiricilere bir tür "beyaz bayrak" içgüdüsünün olması gerekiyor, aksi halde çok fazla keder ve acı çekiyorlar. Böyle hırsları ve mücadele ruhunu, dünyayı fethediyor hırsları arayüz tasarımı seviyesine getirmekten çok, tasarımı daha kolay olan en modern uygulamalara aktarmayı öneriyorum.


1
"Bağımlılıkları, tasarımı zor olan şeylerden uzağa çevirmek" fikrini anlayamıyorum, sadece mirastan mı bahsediyorsunuz? PSP / OpenGL örneğini kullanarak, bir şey yapmak yerine herhangi bir türün nasıl çizileceğini bilen OpenGLBillboardbir yapım yaparsınız ? Fakat bunu mantığı görevlendirerek mi yapar , yoksa koşullu olan devasa anahtarlara veya tiplere sahip olur mu? Bunu anlamakta zorlanıyorum, çünkü bu hiç de sürdürülebilir görünmüyor! OpenGLRendererIBillBoardIBillBoardIBillBoard
Steve Chamaillard

@SteveChamaillard Aradaki fark, PSP'nin (sınırlı donanım) eski okul screendoor şeffaflığı ve farklı bir değerlendirme değerlendirmesi sırasını kullanarak hacim ilkelerini ele alması gerektiğidir: digitalrune.github.io/DigitalRune-Documentation/media/… . RendererPspOyun sahnenizin üst düzey soyutlamalarını bilen bir merkeziniz olduğunda , PSP'ye inandırıcı bir şekilde böyle şeyler yapmak için gereken tüm sihri ve geri çekilmeleri yapabilir ....
Dragon Energy

Halbuki, kendilerini oluşturmak isteyen bu türden ilkellere sahipseniz, operasyonları o kadar yüksek seviyedeydi ki, temelde kendilerini (kendilerini fazlalık ve daha fazla birleştirme yapmadan başka bir fark yaratmaz) ya da render soyutlama yapamazlar. PSP'de mümkün olan en etkili yolun yapılması (en azından geri çekilmeler olmadan, bağımlılıklar tersine çevrildiğinde yapması gerekmeyecek).
Dragon Energy

1
Tamam sanırım şimdi anladım. Temel olarak, bu tür endişelerin (yani donanımın) o kadar yüksek olduğunu söylüyorsunuz ki BillBoard, bunlara bağımlılık gibi düşük seviyeli nesneler yapmak gerçekten zor olur mu? Oysa IRendererki yüksek bir seviye zaten var ve bu kaygılara çok daha az sıkıntı ile bağlı olabilir mi?
Steve Chamaillard

1
Farklı platformlarda en üst düzey görüntü oluşturma kaygıları, farklı donanım yetenekleri ile patron olduğum bir yer tasarlamak ve ne yapacağımı söylemek çok zor. "Hey, bu gibi grimsi sulu parçacıklara sahip bulutlu / sisli bir şeyim ve beni iyi görünmeye çalışın lütfen, son zamanlarda tıraş olmadığım boynumu yakalamayın" demem daha kolay. ve işverenin, birlikte çalıştığı sınırlamalar göz önüne alındığında, beni olabildiğince güzel ve gerçek zamanlı olarak nasıl oluşturabileceğine karar vermesine izin verin. Ne yapacağını söyleme çabası, neredeyse kesinlikle karşı-üretken bir yolla sonuçlanacaktır.
Dragon Energy
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.