Hiçbir şeyi temsil etmeyen sınıf - doğru mu?


42

Uygulamamı tasarlıyorum ve SOLID ve OOP'yi doğru bir şekilde anladığımdan emin değilim. Sınıflar 1 şeyi yapmalı ve iyi yapmalı ancak diğer taraftan birlikte çalıştığımız gerçek nesneleri temsil etmelidir.

Benim durumumda veri setinde bir özellik çıkarımı yapıyorum ve ardından makine öğrenimi analizi yapıyorum. Üç sınıf oluşturabileceğimi farz ediyorum

  1. FeatureExtractor
  2. DataSet
  3. analizör

Ancak FeatureExtractor sınıfı hiçbir şeyi temsil etmez, onu bir sınıftan daha rutin hale getiren bir şey yapar. Kullanılacak tek bir işleve sahip olacaktır: extract_features ()

Bir şeyi temsil etmeyen, bir şeyi yapan sınıflar oluşturmak doğru mu?

EDIT: önemli olup olmadığından emin değilim ama Python kullanıyorum

Eğer extract_features () şöyle görünürse: bu metoda sahip olmak için özel bir sınıf oluşturmaya değer mi?

def extract_features(df):
    extr = PhrasesExtractor()
    extr.build_vocabulary(df["Text"].tolist())

    sent = SentimentAnalyser()
    sent.load()

    df = add_features(df, extr.features)
    df = mark_features(df, extr.extract_features)
    df = drop_infrequent_features(df)
    df = another_processing1(df)
    df = another_processing2(df)
    df = another_processing3(df)
    df = set_sentiment(df, sent.get_sentiment)
    return df

13
Bu bir fonksiyon olarak mükemmel görünüyor. Modül olarak listelediğiniz üç şeyi göz önünde bulundurmanız tamamdır ve bunları farklı dosyalara yerleştirmek isteyebilirsiniz, ancak bu onların sınıf olmaları gerektiği anlamına gelmez.
Bergi

31
Python'da OO olmayan yaklaşımları kullanmanın oldukça yaygın ve kabul edilebilir olduğunu unutmayın.
jpmc26

13
Domain Driven Design ile ilgilenebilirsiniz. "Sınıflar, gerçek dünyadaki nesneleri temsil etmeli" aslında yanlıştır ... etki alanındaki nesneleri temsil etmelidir . Etki alanı genellikle gerçek dünyayla güçlü bir şekilde bağlantılıdır, ancak uygulamaya bağlı olarak bazı şeyler nesne olarak kabul edilebilir veya olmayabilir veya "gerçekte" ayrı olan bazı şeyler, uygulama alanı içinde bağlantılı veya aynı olabilir.
Bakuriu

1
OOP'a daha aşina hale geldikçe, sınıfların nadiren gerçek dünyadaki varlıklarla birebir karşılık geldiğini göreceksiniz. Örneğin, gerçek dünyadaki bir varlık ile ilişkili tüm işlevselliği tek bir sınıfta sıkıştırmaya çalışan bir makale, çok sık karşılaşılan bir karşıt kalıptır: programmer.97things.oreilly.com/wiki/index.php/…
Kevin - Monica

1
"birlikte çalıştığımız gerçek nesneleri temsil etmelidirler." şart değil. Pek çok dil, 'gerçek nesne' yerine soyut bir kavram olan bir bayt akışını temsil eden bir akış sınıfına sahiptir. Teknik olarak bir dosya sistemi de 'gerçek nesne' değildir, sadece bir kavramdır, ancak bazen bir dosya sistemini veya bunun bir parçasını temsil eden sınıflar vardır.
Pharap

Yanıtlar:


96

Sınıflar 1 şey yapmalı ve iyi yapmalı

Evet, bu genellikle iyi bir yaklaşımdır.

fakat diğer taraftan birlikte çalıştığımız gerçek nesneyi temsil etmelidirler.

Hayır, bu bir IMHO ortak yanlış anlaşılmasıdır. OOP'a iyi bir başlangıç ​​yapmak çoğu zaman “gerçek dünyadan şeyleri temsil eden nesnelerle başlamak” şeklindedir , bu doğrudur.

Ancak bununla bitmemelisin !

Programlarınızı çeşitli şekillerde yapılandırmak için sınıflar kullanılabilir (ve gerekir). Nesneleri gerçek dünyadan modellemek bunun bir yönüdür, ancak tek değildir. Belirli bir görev için modüller veya bileşenler oluşturmak, sınıflar için başka bir mantıklı kullanım durumudur. Bir "özellik çıkarıcısı" muhtemelen böyle bir modüldür ve hatta yalnızca bir genel yöntem içeriyorsa extract_features(), eğer çok fazla özel yöntem ve belki de ortak bir durum içermiyorsa şaşırırım. Bu yüzden bir sınıfa sahip olmak FeatureExtractor, bu özel yöntemler için doğal bir yer getirecektir.

Not: Ayrı bir modül kavramını destekleyen Python gibi dillerde de bunun için bir modül kullanılabilir FeatureExtractor, ancak bu soru bağlamında bu IMHO'nun ihmal edilebilir bir farkıdır.

Ayrıca, bir "özellik çıkarıcısı", "özellikleri çıkartan bir kişi veya bot" olarak hayal edilebilir. Bu soyut bir "şeydir", belki de gerçek dünyada bulacağınız bir şey değil, ama ismin kendisi, herkese o sınıfın sorumluluğunun ne olduğu hakkında bir fikir veren yararlı bir soyutlamadır. Bu yüzden bu sınıfın "hiçbir şeyi temsil etmediğini" kabul etmiyorum.


33
Özellikle de iç devlet meselesinden bahsetmiş olman hoşuma gidiyor. Bunu Python'da bir sınıf mı yoksa bir işlev mi yaptığım için karar faktörü olarak buluyorum.
David Z,

17
“Classitis” öneriyor gibi görünüyorsun. Bunun için bir sınıf yapmayın , Java tarzı bir antipattern. Eğer bir işlevse, bir işlev yap. İç durum önemli değil: fonksiyonlar buna (kapamalar yoluyla) sahip olabilir.
Konrad Rudolph

25
@KonradRudolph: Bunun bir işlev yapmakla ilgili olmadığını özlemiş gibisiniz . Bu, birkaç işlev, ortak bir ad ve belki de bazı ortak durumlar gerektiren bir kod parçası ile ilgilidir . Bunun için bir modül kullanmak, sınıflardan ayrı bir modül konseptine sahip dillerde olabilir.
Doc Brown,

8
@DocBrown Katılmam gerekecek. Bir kamu yöntemi ile bir sınıftır. API bilge, bir işlevden ayırt edilemez . Ayrıntılar için cevabımı gör. Bir durumu temsil etmek için belirli bir tür oluşturmanız gerekiyorsa, tek yöntemli sınıfları kullanmak doğrulanabilir . Fakat buradaki durum böyle değil (ve o zaman bile, fonksiyonlar bazen kullanılabilir).
Konrad Rudolph

6
@DocBrown Ne demek istediğinizi anlamaya başladım: içeriden çağrılan işlevlerden mi bahsediyorsunuz extract_features? Bir başka yerden kamusal işlevler olduklarını farz ediyorum. Yeterince adil, eğer bunlar özelse o zaman muhtemelen bir modüle girmeleri gerektiğine katılıyorum (ama yine de: devlet paylaşmadıkça sınıf değil ) extract_features. (Tabii ki, onları bu işlevin içinde yerel olarak ilan edebileceğinizi söyledi.)
Konrad Rudolph

44

Doktor Brown açık: sınıfların gerçek dünyadaki nesneleri temsil etmesi gerekmez. Sadece faydalı olmaları gerekiyor . Sınıflar temel olarak yalnızca ek türlerdir ve gerçek dünyada neye intya da neye stringkarşılık gelir? Bunlar somut değil, somut şeyler olan soyut açıklamalardır.

Bu, davanızın özel olduğunu söyledi. Açıklamanıza göre:

Eğer extract_features () şöyle görünürse: bu metoda sahip olmak için özel bir sınıf oluşturmaya değer mi?

Kesinlikle haklısın: Eğer kodun gösterildiği gibi ise, onu bir sınıfa dönüştürmenin faydası yoktur. Orada ünlü bir konuşma Python sınıfların böyle kullanımları kod koku olduğunu savunuyor ve bu basit işlevleri genellikle yeterlidir. Davanız buna mükemmel bir örnek.

Sınıfların aşırı kullanımı, OOP’un 1990’larda Java ile ana akım haline gelmesinden kaynaklanmaktadır. Ne yazık ki, o zamanlar Java, bazı modern dil özelliklerinden (kapanışlar gibi) yoksundu; Örneğin, Java'da yakın zamana kadar durum taşıyan yöntemlere sahip olmak imkansızdı. Bunun yerine, devleti taşımak için tek bir yöntem ortaya çıkaran (buna benzer bir şey denilen invoke) bir sınıf yazmanız gerekiyordu .

Ne yazık ki bu programlama stili Java'nın ötesinde popüler oldu (kısmen aksi takdirde çok yararlı olan etkili bir yazılım mühendisliği kitabı nedeniyle ), bu tür geçici çözümler gerektirmeyen dillerde bile.

Python'da sınıflar çok önemli bir araçtır ve liberal olarak kullanılmalıdır. Ama onlar tek araç değiller ve onları anlam ifade etmeyen yerlerde kullanmak için hiçbir sebep yok. OOP'de serbest fonksiyonların yeri olmadığı yaygın bir yanılgıdır.


Örnekte çağrılan işlevler aslında özel işlevlerse, bunları bir modül veya sınıf içine yerleştirmenin tamamen uygun olacağını eklemek yararlı olacaktır. Aksi takdirde, tamamen katılıyorum.
Leliel

11
Ayrıca, "OOP" un "bir demet sınıf yazmak" anlamına gelmediğini hatırlamakta fayda var. İşlevler Python'daki nesneler olduğundan, bunu "OOP değil" olarak düşünmeye gerek yok. Daha ziyade, basitçe oluyor yeniden türleri / sınıflar dahili ve "yeniden kullanım" programlamada kutsal Grails biridir. Bunu bir sınıfa __call__
sığdırmak yeniden

3
Ayrıca "sınıflara karşı bağımsız fonksiyonlar" konuyla ilgili olarak
Joker_vD

1
Python'da "serbest işlevler" de bir yöntem ortaya koyan türde nesneler olmasına rağmen durum böyle değil __call__()mi? Bu gerçekten isimsiz bir iç sınıf örneğinden çok mu farklı? Sözdizimsel olarak, elbette ama bir dil tasarımından, burada sunduğunuzdan daha az önemli bir ayrım gibi görünüyor.
JimmyJames

1
@JimmyJames Right. Bütün mesele, belirli bir amaç için aynı işlevselliği sundukları, ancak kullanımı daha basit olmasıdır.
Konrad Rudolph

36

Uygulamamı tasarlıyorum ve SOLID ve OOP'yi doğru bir şekilde anladığımdan emin değilim.

20 yıldır bu işteyim ve ben de emin değilim.

Sınıflar 1 şey yapmalı ve iyi yapmalı

Burada yanlış gitmek zor.

Çalıştığımız gerçek nesneleri temsil etmelidirler.

Gerçekten? Beni her zaman tek ve en popüler ve başarılı sınıfa tanıştırayım: String. Metin için kullanıyoruz. Ve temsil ettiği gerçek dünya nesnesi şudur:

Balıkçı bir ip kordonundan askıya 10 balık tutar

Neden hayır, tüm programcılar balık avına takılmaz. Burada metafor denilen bir şey kullanıyoruz. Gerçekten var olmayan şeylerin modellerini yapmak sorun değil. Net olması gereken fikir bu. Okuyucularınızın kafasında görüntüler yaratıyorsunuz. Bu görüntüler gerçek olmak zorunda değil. Sadece kolayca anladım.

İyi bir OOP tasarımı, mesajların etrafındaki mesajları (yöntemleri) kümeler (bu durum), böylece bu mesajlara verilen reaksiyonlar o verilere bağlı olarak değişebilir. Eğer bu gerçek dünyayı modelliyorsa, huysuz olun. Eğer değilse, oh iyi. Okuyucuya mantıklı geldiği sürece sorun değil.

Şimdi elbette, böyle düşünebilirsin:

Bir dize askıya alınan şenlikli harfler "ŞEYLER YAPALIM!"

ancak bunun metafordan yararlanmadan önce gerçek dünyada olması gerektiğini düşünüyorsanız, programlama kariyeriniz birçok sanat ve zanaat içerecektir.


1
Güzel bir resim dizisi ...
Zev Spitz

Bu noktada "string" in mecazi olduğundan bile emin değilim. Bu tıpkı gibi sözler yapmak, programlama alanında anlamı bir özgü sahiptir classve tableve column...
Kyralessa

@Kyralessa size eter acemi metaforu öğretirsiniz ya da onlara sihir yapmazsınız. Lütfen beni büyüye inanan kodlayıcılardan koru.
candied_orange

6

Dikkat! SOLID hiçbir yerde bir sınıfın sadece "bir şey yapması" gerektiğini söylemez. Durum böyle olsaydı, sınıfların yalnızca tek bir metodu olurdu ve sınıflar ve fonksiyonlar arasında gerçekten bir fark olmazdı.

SOLID, bir sınıfın tek bir sorumluluğu temsil etmesi gerektiğini söylüyor . Bunlar bir takımdaki kişilerin sorumlulukları gibidir: Sürücü, avukat, yankesici, grafik tasarımcı vb.

Bunun amacı şudur: Gereksinimlerde bir değişiklik olursa, ideal olarak sadece tek bir sınıfı değiştirmeniz gerekir. Bu sadece kodu daha kolay anlaşılmasını, değiştirilmesini kolaylaştırır ve riski azaltır.

Bir nesnenin "gerçek bir şeyi" temsil etmesi gerektiği konusunda hiçbir kural yoktur. Bu sadece kargo kültüdür çünkü OO başlangıçta simülasyonlarda kullanılmak üzere icat edilmiştir. Ancak programınız bir simülasyon değil (birkaç modern OO uygulaması), bu nedenle bu kural geçerli değildir. Her sınıfın iyi tanımlanmış bir sorumluluğu olduğu sürece, iyi olmalısın.

Bir sınıf gerçekten sadece tek bir metoda sahipse ve sınıfın herhangi bir durumu yoksa, onu bağımsız bir fonksiyon haline getirmeyi düşünebilirsiniz. Bu kesinlikle gayet iyi ve KISS ve YAGNI ilkelerini takip ediyor - eğer bir işlevle çözebiliyorsanız bir sınıf oluşturmanıza gerek yok. Öte yandan, içsel duruma ya da çoklu uygulamalara ihtiyaç duyacağınıza inanmak için bir nedeniniz varsa, bunu bir sınıf önünden de yapabilirsiniz. Burada en iyi kararınızı kullanmanız gerekecek.


+1 "eğer bir işlevi çözebilirseniz bir sınıf yapmanıza gerek yok" için. Bazen birinin gerçeği konuşması gerekir.
tchrist

5

Bir şeyi temsil etmeyen, bir şeyi yapan sınıflar oluşturmak doğru mu?

Genel olarak bu tamam.

Biraz daha spesifik bir açıklama olmadan, FeatureExtractorsınıfın tam olarak ne yapması gerektiğini açıklamak zor.

Her neyse, FeatureExtractorsadece kamuya açık bir extract_features()işlev ortaya çıkarsa bile Strategy, bir çıkarımın tam olarak nasıl yapılması gerektiğini belirleyen bir sınıfla yapılandırmayı düşünebilirdim .

Başka bir örnek, Template işlevine sahip bir sınıftır .

Ve sınıf modellerine dayanan daha fazla Davranışsal Tasarım Örüntüsü var .


Açıklama için bazı kodlar eklediğiniz gibi.

Eğer extract_features () şöyle görünürse: bu metoda sahip olmak için özel bir sınıf oluşturmaya değer mi?

Çizgi

 sent = SentimentAnalyser()

tam olarak ne demek istediğimi, bir stratejiyi içeren bir sınıfı yapılandırabileceğinizi içerir .

Bu SentimentAnalysersınıf için bir arabiriminiz varsa FeatureExtractor, işlevinizdeki belirli bir uygulamaya doğrudan bağlanmak yerine, onu yapım aşamasında sınıfa aktarabilirsiniz .


2
Karmaşıklığı (bir FeatureExtractorsınıf) eklemek için sadece daha fazla karmaşıklığı ( SentimentAnalysersınıf için bir arayüz) eklemek için bir sebep görmüyorum . Ayrıştırma arzu edilir ise, extract_featuresalabilir get_sentimentbağımsız değişken olarak işlev ( loadçağrı fonksiyonunun bağımsız ve sadece kendi etkileri çağrısında gibi görünüyor). Ayrıca Python'un arayüzleri desteklemediğini / teşvik etmediğini de unutmayın.
Warbo

1
@ warbo - işlevi bir argüman olarak sağlasanız bile, bir işlev yaparak, bir işlev biçimine uyacak olan olası uygulamaları kısıtlarsınız, ancak bir durumla bir çağrı arasında kalıcı durumun yönetilmesine gerek varsa sonraki (örneğin a CacheingFeatureExtractorveya a TimeSeriesDependentFeatureExtractor) o zaman bir nesne çok daha uygun olur. Sadece şu anda bir nesneye ihtiyaç duyulmaması, asla olmayacağı anlamına gelmez.
Jules

3
@Jules Öncelikle İhtiyacınız Olmayacak (YAGNI), ikincisi Python işlevleri, ihtiyaç duyduğunuzda (yapmayacaksınız), üçüncü olarak bir işlevi kullanmak herhangi bir şeyi kısıtlamadığı için kalıcı duruma başvurabilir __call__yöntem, ihtiyacınız olduğunda (yapmayacaksanız), dördüncü olarak FeatureExtractor, kodu yazdığınız diğer tüm kodlarla uyumsuz hale getirdiğiniz gibi bir sarıcı ekleyerek uyumlu olacaktır (bir __call__yöntem belirtmezseniz, bu durumda bir işlev açıkça basitleşir). )
Warbo

0

Desenler ve tüm fantezi dili / kavramları bir kenara bırakın: Tökezlediğiniz şey bir İş veya Toplu İşlemdir .

Günün sonunda, saf bir OOP programının bile bir şekilde bir şey tarafından yönlendirilmesi gerekiyor, aslında iş yapmak; bir şekilde bir giriş noktası olmalı. Örneğin, MVC düzeninde "C" denetleyicisi GUI'den click etc. olaylarını alır ve ardından diğer bileşenleri düzenler. Klasik komut satırı araçlarında "main" işlevi aynı şeyi yapar.

Bir şeyi temsil etmeyen, bir şeyi yapan sınıflar oluşturmak doğru mu?

Sınıfınız bir varlık temsil yapar başka bir şey ve yönetir herşeyi. Sen bunu adlandırabilirsiniz Kontrolör , Job , Main ya da her türlü akla gelir.

Eğer extract_features () şöyle görünürse: bu metoda sahip olmak için özel bir sınıf oluşturmaya değer mi?

Bu şartlara bağlıdır (ve bunun Python'da olduğu gibi normal şekilde aşina değilim). Bu sadece küçük bir tek satırlık komut satırı aracıysa, sınıf yerine bir yöntem iyi olmalıdır. Programınızın ilk sürümü, kesinlikle bir yöntemle kurtulabilir. Daha sonra, belki de karışık olan küresel değişkenlerle bile onlarca yöntemle sonuçlandığını anlarsanız, o zaman sınıflara yeniden ateşleme zamanı gelmiştir.


3
Bunun gibi senaryolarda, bağımsız prosedürleri çağırmanın "yöntemler" in kafa karıştırıcı olabileceğini unutmayın. Python da dahil olmak üzere çoğu dil onlara "işlev" diyor. "Yöntemler", bir sınıfın belirli bir örneğine bağlı olan işlevler / işlemlerdir; bu, terim kullanımınızın tam tersidir :)
Warbo

Yeterince doğru, @Warbo. Ya da onlara prosedür diyebiliriz ya da alt edebilir ya da alt ya da ...; ve bir örnekle ilgili olmayan sınıf yöntemleri olabilir. Umarım nazik okuyucu amaçlanan anlamı soyutlayabilir. :)
AnoE

@Warbo bilmek güzel! Karşılaştığım çoğu öğrenme materyali, fonksiyon ve yöntem terimlerinin birbirinin yerine kullanılabildiğini ve bunun yalnızca dile bağlı bir tercih olduğunu belirtir.
Dom

@Dom Genelde a ("saf") "işlev", giriş değerlerinden çıkış değerlerine bir eşlemedir ; bir "prosedür" aynı zamanda etkilere neden olabilen bir fonksiyondur (örneğin bir dosyayı silmek); her ikisi de statik olarak gönderilir (örneğin, sözcük kapsamına bakın). Bir "yöntem", otomatik olarak yöntemin bir (örtük thisveya açık self) argümanına bağlanan bir değerden ("nesne" olarak adlandırılır) dinamik olarak gönderilen (aranan) bir işlev veya (genellikle) yordamdır . Bir nesnenin metotları karşılıklı olarak "açıkça" özyinelemelidir, bu nedenle değiştirme footüm self.fooçağrıların bu değişimi kullanmasına neden olur .
Warbo

0

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.


0

Pragmatik olarak konuşursak, "önemli bir şey yapan ve ayrı olması gereken çeşitli şeylere" sahip olduğumda ve net bir eve sahip olmadığımda, onu bir Utilitiesbölüme koyup adlandırma sözleşmem olarak kullanırım. yani. FeatureExtractionUtility.

Bir sınıftaki yöntemlerin sayısını unut; Bugün tek bir yöntemin yarın beş yönteme geçmesi gerekebilir. Önemli olan, çeşitli işlev koleksiyonları için bir yardımcı program alanı gibi açık ve tutarlı bir organizasyonel yapıdır.

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.