Hayır , bir nesnenin bir varlığı temsil etmesi gerekmez.
Aslında, nesneler hakkında fiziksel varlıklar olarak düşünmeyi bıraktığınızda, OOP'nin vaat ettiği faydaları elde ettiğiniz zaman olduğunu iddia edeceğim.
Bu en iyi örnek değil, ama Kahve Makinesi tasarımı muhtemelen ışığın benim için gelmeye başladığı yer.
Nesneler mesajlarla ilgilidir. Sorumluluklar hakkında. Arabalar, Kullanıcılar veya Siparişler ile ilgili değiller.
OO'ya bu şekilde öğrettiğimizi biliyorum, ancak birkaç denemeden sonra, MVC, MVVM veya MVWhatever'i denediğinizde işlerin nereye gittiğini anlamanın ne kadar temelden sinir bozucu olduğunu görünce ortaya çıkıyor. Ya modellerin gülünç şişkinleşir ya da kontrolörlerin yapar. Gezinme özelliği için, Araçlara dokunan herhangi bir şeyin Vehicle.ext dosyasında olduğunu bilmek harika, ancak uygulamanız Araçlar hakkında olduğunda, kaçınılmaz olarak o dosyada 3000 satırlık spagetti kalıyor.
Gönderilecek yeni bir mesajınız olduğunda, en az bir tane yeni nesneniz ve belki bir çiftiniz olur. Bu nedenle, bir yöntem demeti hakkındaki sorunuzda, potansiyel olarak bir mesaj demeti hakkında konuştuğunuzu iddia ediyorum. Ve her biri kendi nesnesi olabilir, yapacak işi de vardır. Ve bu tamam. Her şeyi birbirinden ayırdığınızda, gerçekten bir arada olması gerekenler ortaya çıkacak. Ve onları bir araya getirdin. Ancak, OO'nun tadını çıkarmak istiyorsanız, kolaylık olması için her yöntemi belirsizce uygun bir çekmeceye hemen düşürmeyin.
Fonksiyon çantalarından bahsedelim
Bir nesne sadece bir yöntem koleksiyonu olabilir ve yine de OO olabilir, ancak benim "kurallarım" oldukça katı.
Tahsilatın tek bir sorumluluğu olmalı ve bu sorumluluk "Motorlara iş yapar" kadar genel olamaz. Hizmet katmanı cephesi gibi bir şey yapabilirim, ancak gezinme / keşif nedenlerinden dolayı tembel olduğumun farkındayım, OO kodu yazmaya çalışıyorum.
Tüm yöntemler tutarlı bir soyutlama katmanında olmalıdır. Bir yöntem Motor nesnelerini alırken, diğeri Beygir gücü döndürürse, bu muhtemelen birbirinden çok uzaktır.
Nesne aynı "tür" veri üzerinde çalışmalıdır. Bu nesne motorlara bir şey yapar (başlat / durdur), bu krank uzunluğu olan şeyleri yapar, bu bir ateşleme sekansını işler, bu bir html formu alır. Bu veriler makul bir şekilde nesnenin üzerindeki alanlar olabilir ve uyumlu görünebilir.
Genelde bu tür nesneler yapıyorum; dönüşümler, kompozisyonlar yaparken ya da sadece değişkenlik konusunda endişelenmek istemiyorum.
Nesne sorumluluklarına odaklanmanın beni uyuma götürdüğünü biliyorum. Bir nesne olmak için bir miktar uyum olması gerekir, ancak bir nesne olması için herhangi bir alan veya çok fazla davranış olması gerekmez. Bu 5 motor yöntemine ihtiyaç duyan bir sistem inşa ediyor olsaydım, bunları yapan 5 farklı nesne ile başlardım. Ortak bulduğum gibi, ya bir şeyleri birleştirmeye başlar ya da ortak "yardımcı" nesneleri kullanırdım. Bu beni açık / kapalı kaygılara sürüklüyor - bu işlevsellik parçasını nasıl çıkarabilirim, böylece belirli bir dosyayı bir daha asla değiştirmek zorunda kalmayabilirim ama yine de gerektiğinde kullanabilirim?
Nesneler mesajlarla ilgilidir.
Alanlar bir nesneye zar zor gelir - kayıtları almak ve ayarlamak, program dışındaki dünyayı değiştirmez. Diğer nesnelerle işbirliği yapmak işi halleder. Bununla birlikte, OO'nun gücü soyutlamalar yaratabildiğimiz için tüm bireysel ayrıntıları bir kerede düşünmek zorunda kalmayız. Sızan veya anlam ifade etmeyen soyutlamalar problemlidir, bu yüzden zihinsel modellerimizle eşleşen nesneler yaratma konusunda derinden (çok, belki de) düşünüyoruz.
Anahtar soru: Bu iki nesnenin neden birbiriyle konuşması gerekiyor?
Nesneyi bir insandaki organ olarak düşünün - varsayılan bir amacı vardır ve yalnızca ilgilendiği belirli bir mesajı aldığında davranışını değiştirir.
Yaya geçidinde olduğunuz ve bir arabanın hızlı bir şekilde geldiği bir senaryo düşünün. Beyin nesnesi olarak bir stres etkeni tespit ediyorum. Hipotalamusa kortikotrofin salgılayan hormon göndermesini söylüyorum. Hipofiz bezi bu mesajı alır ve adrenal kortikotrofik hormonu serbest bırakır. Adrenal bezler bu mesajı alır ve adrenalin oluşturur. Kas nesnesi bu adrenalin mesajını aldığında büzülür. Kalp aynı mesajı aldığında, daha hızlı atıyor. Caddenin karşısındaki sprint yapma davranışını başlatmaya dahil olan bütün bir oyuncu zinciri var ve önemli olan mesajlar. Beyin nesnesi, hipotalamusun uyarıyı göndermesini nasıl sağlayacağını bilir, ancak sonunda davranışı gerçekleştirecek olan nesneler zincirini bilmiyor. Aynı şekilde, kalp, adrenalinin nereden geldiği hakkında hiçbir fikri yok.
Dolayısıyla bu ( basitleştirilmiş ) örnekte, böbreküstü bezi nesnesinin yalnızca ACTH'yi nasıl alacağını ve adrenalini nasıl yapacağını bilmesi gerekir. Bunu yapmak için herhangi bir alana ihtiyacı yok, ancak yine de bana bir nesne gibi görünüyor.
Şimdi eğer uygulamamız sadece caddeye sıçramak için tasarlandıysa, hipofiz bezine ve böbreküstü bez nesnelerine ihtiyacım olmayabilir. Ya da sadece kavramsal olarak "hipofiz bezi modeli" olarak görebileceklerimizin sadece küçük bir kısmını yapan hipofiz bezi nesnesine ihtiyacım var. Bu kavramların tümü kavramsal varlıklar olarak mevcuttur, ancak bu bir yazılımdır ve AdrenalineSender veya MuscleContractor'ı yapabiliriz veya ne olursa olsun, modelimizin "eksikliği" hakkında endişelenmeyin.