OOP'yi bir sistemin davranışını modellemek olarak düşünebiliriz . Sistemin 'gerçek dünyada' olması gerekmediğine dikkat edin , ancak gerçek dünya metaforları bazen yararlı olabilir (örneğin, "boru hatları", "fabrikalar" vb.).
İstenilen sistem bir kerede hepsini modellemek için çok karmaşıksa, onu daha küçük parçalara bölebiliriz ve daha fazla parçalanmayı içerebilecek olanları ("sorun alanı") modelleyebiliriz; (az ya da çok) sayı, dize, liste vb. gibi bazı yerleşik dil nesnesininki
Bu basit parçalara sahip olduktan sonra, daha büyük parçalarda bir araya getirebileceğimiz daha büyük parçaların davranışını tanımlamak için onları bir araya getirebiliriz ve böylece, bir alan için ihtiyaç duyulan tüm alan bileşenlerini tanımlayana kadar devam edebiliriz. sistemi.
Bazı sınıfları yazabileceğimiz bu “bir araya getirme” aşamasıdır. İstediğimiz şekilde davranan varolan bir nesne olmadığında sınıfları yazarız. Örneğin, etki alanımızda "foos", "bar" adı verilen foos koleksiyonları ve "bazs" adı verilen bar koleksiyonları bulunabilir. Fooların stringlerle modellenecek kadar basit olduğunu fark edebiliriz, o yüzden bunu yaparız. Çubukların, içeriklerinin Python'un sağladığı hiçbir şeyle uyuşmayan belirli bir kısıtlamaya uymalarını gerektirdiğini buluyoruz, bu durumda bu kısıtlamayı uygulamak için yeni bir sınıf yazabiliriz. Belki bazların böyle bir özelliği yoktur, bu yüzden onları bir liste ile temsil edebiliriz.
Biz o Not olabilir bu bileşenlerin (Foo'larınız, barlar ve bazs) her biri için yeni bir sınıf yazmak, ama biz değil gerek zaten doğru davranışlarla bir şey varsa için. Özellikle, bir sınıfın yararlı olması için 'bir şeyler sağlaması gerekir (veri, yöntemler, sabitler, alt sınıflar vb.), Bu nedenle birçok özel sınıf katmanımız olsa bile , en sonunda bazı yerleşik özellikleri kullanmalıyız; Örneğin, foos için yeni bir sınıf yazarsak, muhtemelen sadece bir dize içerecektir, öyleyse neden foo sınıfını unutmuyorsunuz ve bar sınıfının bunun yerine bu dizeleri içermesi gerekiyor? Sınıfların aynı zamanda yerleşik bir nesne olduğunu unutmayın, sadece esnek bir yapıya sahipler.
Etki alanı modelimize sahip olduktan sonra , bu parçaların bazı özel örneklerini alabilir ve onları modellemek istediğimiz belirli bir sistemin "simülasyonuna" düzenleyebiliriz (örneğin, "için bir makine öğrenme sistemi ...").
Bu simülasyona sahip olduktan sonra, onu çalıştırabiliriz ve hey presto'ya göre ... (veya modellemekte olduğumuz herhangi bir şey) için bir makine öğrenme sistemi çalışıyor.
Şimdi, sizin özel durumunuzda bir "özellik çıkarıcı" bileşeninin davranışını modellemeye çalışıyorsunuz. Sorun şu ki, bir "özellik çıkarıcısı" gibi davranan yerleşik nesneler var mı, yoksa daha basit şeylere bölmeniz mi gerekecek? Özellik çıkarıcıları işlev nesnelerine çok benzer davranıyor gibi görünüyor, bu yüzden bunları modeliniz olarak kullanmanız iyi olur.
Bu tür kavramları öğrenirken akılda tutulması gereken bir şey, farklı dillerin farklı yerleşik özellikler ve nesneler sunabileceğidir (ve elbette bazıları "nesneler" gibi terminolojiyi bile kullanmazlar!). Bu nedenle, bir dilde anlam ifade eden çözümler başka bir dilde daha az faydalı olabilir (bu aynı dilin farklı sürümleri için de geçerli olabilir!).
Tarihsel olarak, birçok OOP literatürü (özellikle "tasarım desenleri") Python'dan oldukça farklı olan Java'ya odaklandı. Örneğin, Java sınıfları nesne değildir, Java çok yakın zamana kadar işlev nesnelerine sahip değildi, Java, katı tip denetime sahip (arayüzleri ve alt sınıfları teşvik ediyor), Python ördek tipini yazmayı teşvik ederken, Java modül nesnelerine sahip değil, Java tamsayıları / yüzer / vb. Nesneler değildir, Java'daki meta-programlama / içe dönüklük "yansıma" vb. gerektirir.
Java'yı seçmeye çalışmıyorum (başka bir örnek olarak, çok sayıda OOP teorisi, Python'dan yine çok farklı olan Smalltalk etrafında döner), sadece bağlam hakkında çok dikkatli düşünmemiz gerektiğine işaret etmeye çalışıyorum. çözümlerin geliştirildiği kısıtlamalar ve bunun içinde bulunduğumuz duruma uygun olup olmadığı.
Senin durumunda, bir işlev nesnesi iyi bir seçim gibi görünüyor. Bazı "en iyi uygulamalar" kılavuzunun neden fonksiyon nesnelerinden olası bir çözüm olarak bahsetmediğini merak ediyorsanız, bu kılavuzların eski Java sürümleri için yazılmış olması olabilir.