Bertrand Meyer neden alt sınıflamanın “kapalı” bir modülü genişletmenin tek yolu olduğunu düşünüyor (/ yaptı)?


19

Meyer'ın Nesneye Dayalı Yazılım Yapımında (1988) açık / kapalı prensibini şu şekilde tanımlar :

  • Bir modül hala uzatma için mevcutsa açık olacaktır. Örneğin, içerdiği veri yapılarına alan veya gerçekleştirdiği işlevler kümesine yeni öğeler eklemek mümkün olmalıdır.
  • Bir modülün başka modüller tarafından kullanılabilmesi için kapalı olduğu söylenecektir. Bu, modüle iyi tanımlanmış, kararlı bir açıklama verildiğini varsayar (bilgi gizleme anlamında arayüz).

Söylemeye devam ediyor:

Bir modülü yeniden açarsanız, eski sürüme bağlı oldukları için tüm istemcilerini güncellemek için yeniden açmanız gerekir. … [Bu sorun] bir modülün yeni bir işlev veya veri elemanı tarafından her genişletilmesi gerektiğinde, doğrudan ve dolaylı istemcilerdeki değişiklikleri tetikler. ... Tasarım ve programlamaya klasik yaklaşımlarla, hem açık hem de kapalı modüller yazmanın bir yolu yoktur.

Meyer'ın bu ikileme çözümü: asla mevcut sınıfları değiştirerek kütüphane modülünü genişletmeyin; bunun yerine, varolan sınıfların alt sınıflarını oluşturan yeni bir modül yazın ve yeni istemcilerin bu yeni modüle bağlı olmasını sağlayın.

1988'de Turbo Pascal ve Blankenship Basic'te oyuncak (prosedürel) programlar yazıyordum ve 21. yüzyıl mesleki deneyimim JVM, CLR ve dinamik dillerde, bu yüzden Meyer'ın ne anlama geldiğini bilmiyorum "tasarım ve programlamaya klasik yaklaşımlar".

Meyer'ın, istemci modüllerinin neden yeniden açılması gerektiğine dair somut bir örnek ( şimdi daha fazla üyesi olan, daha fazla dava gerektiren bir numaralandırma hakkındaki bir anahtar ifadesi) yeterince makul görünüyor, ancak bir kütüphaneye her işlev eklediğinizde bu iddiayı neredeyse haklı çıkarmıyor. modülü, tüm istemcilerini güncellemeniz gerekir .

Bu iddianın 1988'de aşikâr görünmesinin tarihsel bir nedeni var mı? Diyelim ki, C statik kitaplığına işlevler veya veri yapıları eklemek düzeni geriye dönük uyumlu API'larda bile istemcilerin yeniden derlenmesi gerektiği şekilde değiştirdi mi? Yoksa Meyer gerçekten sadece API geriye dönük uyumluluğunu uygulamak için bir mekanizma hakkında mı konuşuyor?


3
İlginç soru! Cevabın, bir şekilde Modüler Programlama'daki iki klasik veri soyutlama mekanizması olan Soyut Veri Türleri ve Nesneye Dayalı Veri Soyutlama arasındaki temel farkla ilgili olacağını hissediyorum. ") ve Nesneye Dayalı Programlama (yorumları okuyun!).
Jörg W Mittag

Bu garip. Görünüşe göre gerçekle çelişiyor (1988'de bile). Ayrıca, onun savunucu yaklaşımı modüllerin yararsız bir şekilde çoğalmasına neden olacaktır.

@ dan1111: Eiffel'in kalıtım konusundaki yaklaşımı, ancak bunlarla sınırlı olmamak üzere, çoklu kalıtım yaklaşımı C ++, Java, C #, vs.'den farklıdır, bu nedenle yaklaşımın farklı olması şaşırtıcı değildir. Sonuçta Eiffel'i özellikle OO hakkındaki görüşlerini desteklemek için geliştirdi.
Jörg W Mittag

Yanıtlar:


18

Anlayabildiğim kadarıyla, bu soru Bertrand Meyer tarafından cevaplandı ve cevap, bu ifadenin doğru olmadığı. Tasarım ve programlamaya klasik yaklaşımlarla, aslında hem açık hem de kapalı modüller yazmanın bir yolu olabilir .

Bunu bulmak için, bu kitabın ikinci baskısını incelemeniz gerekiyor (dokuz yıl sonra 1997'de yayınlandı). İkinci baskıya göre Önsöz'e göre ,

bir güncelleme değil, kapsamlı bir yeniden çalışmanın sonucu. Orijinal sürümün bir paragrafına dokunulmamış. (Aslında neredeyse tek bir satır.)

Özellikle, sizi şaşırtan ifade gitti. "§3.3 Beş İlke" de halen Açık-Kapalı prensip bölümü bulunmaktadır ve bu konuyla ilgili olarak "§14.7 Kalıtıma Giriş" bölümünde daha ayrıntılı bir tartışma vardır, ancak ilk basımdan ifade artık yoktur.

Bunun yerine, önceki yöntemlerin aksine OO yaklaşımında bunun nasıl daha uygun ve deyimsel olduğuna odaklanır,

Kalıtım sayesinde OO geliştiricileri, yazılım geliştirmeye önceki yöntemlerle mümkün olandan çok daha artımlı bir yaklaşım benimseyebilirler ... (§3.3)

Bu çifte gereklilik (açık ve kapalı) bir ikileme benziyor ve klasik modül yapıları ipucu vermiyor. Ama kalıtım bunu çözer. Bir sınıf, derlenebilir, bir kitaplıkta saklanabilir, temel alınır ve istemci sınıfları tarafından kullanılabilir. Ama aynı zamanda açıktır, çünkü herhangi bir yeni sınıf onu üst öğe olarak kullanabilir, yeni özellikler ekleyebilir ve devralınan özellikleri yeniden ifade edebilir; bu süreçte orijinali değiştirmeye veya müşterilerini rahatsız etmeye gerek yoktur ... (§14.7)

Meyer'ın burada "klasik yaklaşımların" ne anlama geldiğini merak ettiğinizden, bunların açıklamalarını §4.7 Geleneksel Modüler Yapılar'da bulabilirsiniz . Bu bölüm, bu "rutin kütüphaneler" ve "paketler" anlamına gelir (ikincisi için yazar, terimin Ada'dan alındığını söyler ve bu özelliğe sahip diğer dillerden bahseder - CLU'daki kümeler ve Modula'daki modüller).

Bunu düşünürseniz, bu yaklaşımların hiçbiri başlangıçta açık-kapalı prensibine uygun kod yazma konusunda yardımcı olmayı amaçlamamıştır. Bu, yazarı, daha sonra ikinci baskıda düzeltilen biraz erken değerlendirmelerine yönlendirebilir.


Yazarın birinci ve ikinci baskı arasında bu ifadeyle ilgili fikrini özel olarak değiştiren şeylere gelince, bir kez daha kitabın kendisinde, yani Kısım F: Yöntemi çeşitli dillerde ve ortamlarda uygulamada bir cevap bulabilirim " . bu bölümde yazar, nesne yönelimli yöntemlerin eski dillerde nasıl kullanılabileceğini tartışmaktadır:

Fortran gibi klasik diller hiç OO değildir, ancak onları hala kullanması gereken insanlar ... bu eski yaklaşımların sınırlamaları dahilinde mümkün olduğunca çok OO fikri uygulamak isteyebilir.

Özellikle, bu bölümde Meyer, C ve hatta Fortran'da mirasın (bazı uyarılar ve sınırlamalarla, ama yine de) uygulanmasının nasıl mümkün olabileceğini ayrıntılı olarak açıklar.

Görüyorsunuz, bu gerçekten bu ifadeyi ilk baskıdan itibaren gözden geçirmeyi gerektiriyor. O nasıl tam üzerinde gerçekçi örneklerle "klasik yaklaşımlar ile ... hiçbir şekilde" uzlaştırmak için nasıl açıklamak hemen imkansız görünüyor olabilir yapılabilir.


İlginç ve kesinlikle ikinci baskıyı yakalamaya çalışacağım, ancak hala OO olmayan "klasik" bir kütüphanenin bile neden rahatsız etmeden (en azından belirli türlerde) özellikler ekleyemediği hala net değil. istemciler.
David Moles

@DavidMoles olan şu ki, olabilir , ve benim cevap son bölümünde açıklar ve Meyer o kendisi (o 2nd Edition için yeniden bir çalışma olduğunda) fark ve hatta bu yapılabilir nasıl örnekler verdi. "Özellikle yazarın fikrini değiştiren şeylere gelince ..." vb
gnat

Hmm. Bu kitaplığın sürüm 1'in yerini alan ve onunla geriye dönük olarak uyumlu olan "sürüm 2'yi görmüyorum:" "kalıtım" olarak mümkün olan en geniş kavramsal yol dışında.
David Moles

(Benim için miras, sürüm 1'in hala etrafta olduğunu ve sürüm 2 tarafından çağrıldığını ima eder.)
David Moles

@DavidMoles sürüm 2 ile değiştirilir (olduğu gibi, kaynak kodunu değiştirin ve yeniden derleyin ) "değişiklik için kapalı" olarak nitelendirilmez, bunu Wikipedia makalesinde kolayca kontrol edebilirsiniz : "varlık, davranışının kaynak kodunu değiştirmeden genişletilmesine izin verebilir ... "
gnat
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.