Programımdaki nesneleri değişmez hale getirmenin yararlarını görüyorum. Uygulamam için iyi bir tasarım gerçekten derinden düşündüğümde, çoğu zaman doğal olarak nesnelerimin çoğunun değişmez olduğuna ulaşıyorum. Genellikle tüm nesnelerimin değişmez olmasını istediğim noktaya gelir .
Bu soru aynı fikirle ilgilidir, ancak hiçbir cevap değişmezliğe iyi bir yaklaşımın ne olduğunu ve ne zaman kullanılacağını göstermez. Bazı değişmez tasarım kalıpları var mı? Genel fikir, pratikte işe yaramaz olan “değişmeleri için kesinlikle onlara ihtiyaç duymadıkça nesneleri değişmez kılmak” gibi görünmektedir.
Benim tecrübem, değişmezliğin kodumu fonksiyonel paradigmaya gittikçe daha fazla yönlendirmesi ve bu ilerlemenin her zaman gerçekleşmesidir:
- Listeler, haritalar vb. Gibi kalıcı (işlevsel anlamda) veri yapılarına ihtiyaç duymaya başladım.
- Çapraz referanslar ile çalışmak son derece sakıncalıdır (örneğin, çocuklarını ebeveynlerine gönderme yaparken çocuklarına atıfta bulunan ağaç düğümü), çapraz referansları kullanmama neden olur, bu da veri yapılarımı ve kodumu daha işlevsel hale getirir.
- Kalıtım herhangi bir anlam ifade etmeyi bırakır ve onun yerine kompozisyon kullanmaya başlarım.
- OOP gibi kapsüllemenin tüm temel fikirleri parçalanmaya başlar ve nesnelerim işlevler gibi görünmeye başlar.
Bu noktada pratik olarak artık OOP paradigmasından hiçbir şey kullanmıyorum ve tamamen işlevsel bir dile geçebiliyorum. Bu yüzden sorum: değişmez OOP tasarımına tutarlı bir yaklaşım var mı ya da değişmez fikri tam potansiyeline götürdüğünüzde, artık her zaman OOP dünyasından hiçbir şeye ihtiyaç duymayan fonksiyonel bir dilde programlama yapmanız gerekiyor mu? Hangi sınıfların değiştirilemez olması ve hangilerinin OOP'un parçalanmamasını sağlamak için değişebilir kalması gerektiğine karar vermek için iyi yönergeler var mı?
Sadece kolaylık olması için bir örnek vereceğim. ChessBoard
Değişmez satranç taşları koleksiyonuna sahip olalım (soyut sınıfı genişletelim)Piece
). OOP bakış açısından, bir parça tahtadaki konumundan geçerli hamleler üretmekten sorumludur. Ancak hamleleri oluşturmak için parçanın tahtasına bir referans alması gerekirken, tahtanın parçalarına referans alması gerekir. OOP dilinize bağlı olarak bu değişmez çapraz referansları oluşturmak için bazı hileler var, ancak yönetmek için acı veriyorlar, tahtaya referans verecek bir parçaya sahip değiller. Ama sonra tahta hamlelerini üretemez çünkü tahtanın durumunu bilmiyor. Sonra parça sadece parça tipini ve konumunu tutan bir veri yapısı haline gelir. Daha sonra, her türlü parça için hareket oluşturmak için polimorfik bir fonksiyon kullanabilirsiniz. Bu, işlevsel programlamada mükemmel bir şekilde elde edilebilir, ancak çalışma zamanı kontrolleri ve diğer kötü OOP uygulamaları olmadan OOP'de neredeyse imkansızdır ...