Son zamanlarda aşağıdaki durumla karşılaştım.
class A{
public:
void calculate(T inputs);
}
İlk olarak, A
fiziksel dünyada, sınıfı bölmemek için güçlü bir argüman olan bir nesneyi temsil eder. Şimdi, calculate()
oldukça uzun ve karmaşık bir fonksiyon olduğu ortaya çıktı. Bunun için üç olası yapı algılarım:
- bir metin duvarı olarak yaz - avantajlar - tüm bilgiler tek bir yerde
private
sınıfta yardımcı fonksiyonlar yazabilir ve bunlarıcalculate
vücudun dezavantajlarında kullanabilir - sınıfın geri kalanı bu yöntemleri bilmez / umursamaz / anlamazyazma
calculate
aşağıdaki şekilde:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
Bu iyi veya kötü bir uygulama olarak düşünülebilir mi? Bu yaklaşım herhangi bir sorun ortaya çıkarıyor mu? Sonuçta, yine aynı durumla karşılaştığımda bunu iyi bir yaklaşım olarak mı değerlendirmeliyim?
DÜZENLE:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
Tüm bu yöntemler:
- bir değer al
- durum kullanmadan diğer bazı değerleri hesapla
- durumlarını değiştirmek için bazı "alt model nesneleri" çağırın.
Bunun dışında set_room_size()
, bu yöntemlerin istenen değeri basitçe alt nesnelere ilettiği ortaya çıkıyor . set_room_size()
Öte yandan, birkaç gizli formül ekranı vardır ve daha sonra (2) elde edilen çeşitli sonuçları uygulamak için alt nesne ayarlayıcılarını çağırmanın yarım ekranını yapar. Bu nedenle, işlevi iki lambdaya ayırdım ve işlevin sonunda çağırıyorum. Daha mantıklı parçalara bölebilseydim, daha fazla lambdaları izole ederdim.
Her şeye rağmen, mevcut sorunun amacı, bu düşünme biçiminin devam edip etmeyeceğini belirlemektir veya en iyi ihtimalle değer katmayacak mı (okunabilirlik, sürdürülebilirlik, hata ayıklama yeteneği vb.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
Elbette fiziksel dünyada var olabilecek bir nesne hakkındaki verileriA
temsil eder . Sen bir örneğini olabilir gerçek nesne ve bir örneği olmadan gerçek bir nesne olmadan yüzden onlar gibiler birini onları tedavi ve aynı derecede saçmadır. A
A
calculate()
bu alt fonksiyonları bilmeyecek.
A
, bu biraz aşırıya kaçar.
A
fiziksel dünyada, sınıfı bölmemek için güçlü bir argüman olan bir nesneyi temsil eder." Ne yazık ki, programlamaya başladığımda bunu söyledim. Bunun bir sürü at hokeyi olduğunu fark etmem yıllar aldı. Bir şeyleri gruplandırmak için korkunç bir neden. Ne ifade edemez vardır (en azından benim memnuniyeti için) grubu şeyler için iyi nedenler var; ama bu şu anda atmak gerekir biridir. Sonuç olarak, "iyi kod" un tamamı doğru çalışması, anlaşılması nispeten kolay olması ve değiştirilmesi nispeten kolaydır (yani, değişikliklerin garip yan etkileri yoktur).