OO Dilleri, düşük seviyeli dillerin yerine, bazen doğrudan bir makineyle arayüz oluşturmak için kullanılabilir. C ++ Elbette, ama C # için bile adaptörler var. Her ne kadar mekanik parçaları kontrol etmek ve bellek üzerinde küçük bir kontrol yapmak için kod yazsalar en iyi şekilde mümkün olduğunca düşük seviyelere yakın tutulur. Ancak bu soru, İş Hattı, web uygulamaları, IOT, Web Servisleri ve kitlesel kullanılan uygulamaların çoğunluğu gibi mevcut Nesne Yönelimli yazılımlarla ilgili ise, o zaman ...
Varsa cevap
Okuyucular Servis Odaklı Mimari (SOA) ile çalışmayı deneyebilir. Bu, DDD, N Katmanlı, N Katmanlı, Altıgen, her neyse. Son 10 yılda 70’lerde ve 80’lerde açıklandığı gibi, "Geleneksel" OO’yu (Aktif Kayıtlı veya Zengin Modeller) etkin bir şekilde kullanan bir Büyük işletme uygulaması görmedim. (Bkz. Not 1)
Hata OP ile ilgili değil, ancak soruyla ilgili birkaç sorun var.
Sağladığınız örnek Polimorfizmi göstermek için basitçe üretim kodu değildir. Bazen tam olarak bunun gibi örnekler tam anlamıyla alınır.
FP ve SOA'da, Veriler Business Logic'ten ayrılır. Yani, Veri ve Mantık bir arada gitmiyor. Mantık Hizmetlere Giriyor ve Veri (Etki Alanı Modelleri) Polimorfik davranışa sahip değil (Bkz. Not 2).
Hizmetler ve İşlevler Polimorfik olabilir. FP'da, işlevleri sık sık parametre yerine diğer işlevlere değer yerine geçirirsiniz. Aynısını, Callable veya Func gibi OO Languages'da yapabilirsiniz, ancak yaygın değildir (Not 3'e bakınız). FP ve SOA’da, Modelleriniz Polimorfik değil, yalnızca Servisleriniz / İşlevleriniz. (Bkz. Not 4)
Bu örnekte kötü bir kodlama durumu var. Sadece kırmızı renkli "köpek havlamaları" dizisinden bahsetmiyorum. Ayrıca CatModel ve DogModel’lerin kendileri hakkında da konuşuyorum. Bir Koyun eklemek istediğinizde ne olur? Kodunuza girmeli ve yeni kod oluşturmalısınız? Niye ya? Üretim kodunda, özellikleri olan sadece bir AnimalModel görmeyi tercih ederim. En kötüsü, özellikleri ve kullanım özellikleri çok farklıysa, bir AmphibianModel ve FowlModel.
Geçerli bir "OO" dilinde görmeyi beklediğim şey bu:
public class Animal
{
public int AnimalID { get; set; }
public int LegCount { get; set; }
public string Name { get; set; }
public string WhatISay { get; set; }
}
public class AnimalService : IManageAnimals
{
private IPersistAnimals _animalRepo;
public AnimalService(IPersistAnimals animalRepo) { _animalRepo = animalRepo; }
public List<Animal> GetAnimals() => _animalRepo.GetAnimals();
public string WhatDoISay(Animal animal)
{
if (!string.IsNullOrWhiteSpace(animal.WhatISay))
return animal.WhatISay;
return _animalRepo.GetAnimalNoise(animal.AnimalID);
}
}
OO'daki Sınıflardan Fonksiyonel Programlamaya Nasıl Geçersiniz? Diğerlerinin dediği gibi; Yapabilirsin ama gerçekten değilsin. Yukarıdakilerin amacı, Java ve C # yaparken Sınıfları (dünyanın geleneksel anlamında) kullanmamanız gerektiğini göstermektir. Servis Odaklı bir Mimaride (DDD, Katmanlı, Katmanlı, Altıgen, her neyse) kod yazdığınızda, Verilerinizi (Etki Alanı Modelleri) Mantıksal İşlevlerinizden (Hizmetler) ayırdığınız için İşlevsel'e bir adım daha yakın olacaksınız.
OO Dili FP'ye bir adım daha yakın
Hatta biraz daha ileri götürüp SOA Servislerinizi iki türe ayırabilirsiniz.
İsteğe Bağlı Sınıf Tip 1 : Giriş Noktaları için Ortak Arayüz Uygulama Servisleri. Bunlar, "Pure" veya "Impure" başka işlevler oluşturabilen "saf" giriş noktaları olacaktır. Bu, RESTful bir API’dan Giriş Noktalarınız olabilir.
İsteğe Bağlı Sınıf Tip 2 : Saf İş Mantığı Servisleri. Bunlar "Saf" işlevselliğe sahip Statik Sınıflardır. FP'de "Saf" hiçbir yan etkisi olmadığı anlamına gelir. Açıkça Devlet veya Kalıcılık ayarını hiçbir yerde yapmaz. (Bkz. Not 5)
Bu nedenle, Servis Odaklı bir Mimaride kullanılan Nesneye Dayalı Dillerde Sınıflar'ı düşündüğünüzde, yalnızca OO Kodunuza fayda sağlamakla kalmaz, Fonksiyonel Programlamanın anlaşılması çok kolay görünmeye başlar.
notlar
Not 1 : Orijinal "Zengin" veya "Aktif Kayıt" Nesneye Yönelik Tasarım hala buralarda. İnsanlar bir on yıl veya daha uzun bir süre önce "doğru şekilde yapıyor" olduğunda, bunun gibi bir çok eski kural vardır. Bu tür bir kodun (doğru yapıldığında) son gördüğümde C ++ 'da Codebase adlı bir video oyunundan geliyordu. Burada hafızayı tam olarak kontrol ediyorlardı ve çok az yer kaplıyorlardı. FP ve Servis Odaklı Mimarilerin hayvanlar olmadığı ve donanım düşünmemeleri gerektiği söylenemez. Ancak, sürekli değişim, bakım, değişken veri boyutlarına ve öncelikli diğer özelliklere sahip olma yeteneğini yerleştiriyorlar. Video oyunlarında ve AI makinesinde, sinyalleri ve verileri çok hassas bir şekilde kontrol edersiniz.
Not 2 : Etki Alanı Modellerinde Polimorfik Davranış yok, Dış Bağımlılıklar da yok. Onlar "İzole" dir. Bu,% 100 Anemik olmaları gerektiği anlamına gelmez. Varsa inşaat ve değiştirilebilir mülk tadilatı ile ilgili birçok mantığı olabilir. Bkz. DDD "Değer Nesneleri" ve Varlıklar, Eric Evans ve Mark Seemann.
Not 3 : Linq ve Lambda çok yaygındır. Ancak bir kullanıcı yeni bir fonksiyon yarattığında, nadiren Func veya Callable'ı parametre olarak kullanır, FP'de ise bu modeli takip eden fonksiyonları olmayan bir uygulamayı görmek tuhaf olurdu.
Not 4 : Polimorfizmi Kalıtımla karıştırmamak. Bir CatModel, bir Hayvanın tipik olarak hangi Özelliklerine sahip olduğunu belirlemek için AnimalBase'i devralabilir. Ama gösterdiğim gibi, bunun gibi Modeller Kod Kokusu . Bu modeli görürseniz, onu parçalayıp verilere dönüştürmeyi düşünebilirsiniz.
Not 5 : Saf fonksiyonlar fonksiyonları parametre olarak kabul edebilir (ve yapabilir). Gelen işlev saf olmayabilir, ancak saf olabilir. Test amacıyla, her zaman saf olurdu. Fakat üretimde saf olarak kabul edilmesine rağmen, yan etkiler içerebilir. Bu, saf işlevin saf olduğu gerçeğini değiştirmez. Parametre fonksiyonu saf olmasa da. Kafa karıştırıcı değil! : D