Büyük yöntemleri (ya da prosedürleri ya da işlevleri - bu soru OOP'a özgü değilken , OOP dillerinde zamanın% 99'unda çalıştığım için, en rahat olduğum terminoloji) birçok küçük içine ayırdığımda , Sık sık kendimi sonuçlardan memnun hissetmiyorum. Bu küçük yöntemlerle ilgili olarak akılda tutulması zor olanlardan sadece kod blokları olduklarından daha zorlaşır, çünkü onları çıkardığımda, arayan kişinin bağlamından gelen birçok temel varsayımı kaybederim.
Daha sonra, bu koda baktığımda ve bireysel yöntemleri gördüğümde, nereden çağırıldıklarını hemen bilmiyorum ve onları dosyanın herhangi bir yerinden çağrılabilecek sıradan özel yöntemler olarak düşünüyorum. Örneğin, bir başlatma yönteminin (yapıcı veya başka türlü) bir dizi küçük seçeneğe bölündüğünü hayal edin: yöntemin kendisinde, nesnenin durumunun hala geçersiz olduğunu açıkça biliyorsunuzdur, ancak sıradan bir özel yöntemde muhtemelen o nesnenin varsayımına girersiniz Zaten başlatıldı ve geçerli bir durumda.
Bunun için gördüğüm tek çözüm where
, sadece "ebeveyn" işlevinde kullanılan küçük işlevleri tanımlamanıza izin veren Haskell'deki fıkra. Temel olarak, bu gibi görünüyor:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
Ancak kullandığım diğer diller böyle bir şeye sahip değil - en yakın şey, muhtemelen daha da kafa karıştırıcı olan yerel bir kapsamda bir lambda tanımlamak.
Öyleyse benim sorum şu - bununla karşılaşıyor musunuz ve bunun bir problem olduğunu görüyor musunuz? Bunu yaparsanız, genellikle Java / C # / C ++ gibi "ana akım" OOP dillerinde bunu nasıl çözersiniz?
Çiftler hakkında düzenleme : Başkalarının farkına vardığı gibi, bölme yöntemlerini tartışan sorular ve bir soru olan küçük sorular var. Onları okudum ve arayanın bağlamından kaynaklanabilecek temel varsayımlar konusunu tartışmıyorlar (yukarıdaki örnekte, başlatılan nesne). Bu benim sorum nokta ve bu yüzden sorum farklı.
Güncelleme: Aşağıdaki soru ve tartışmayı takip ettiyseniz , konuyla ilgili özellikle John Carmack'in bu makalesinin tadını çıkarabilirsiniz :
Gerçekleştirilen kodun farkındalığının yanı sıra, satır içi işlevler, işlevi başka yerlerden çağırmayı mümkün kılma avantajına da sahiptir. Kulağa saçma geliyor ama bunun bir anlamı var. Bir kod temeli yıllarca kullanıldıkça büyüdükçe, kısayol almak için birçok fırsat olacak ve sadece yapılması gerektiğini düşündüğünüz işi yapan bir işlev çağırın. PartialUpdateA () ve PartialUpdateB () işlevini çağıran bir FullUpdate () işlevi olabilir, ancak belirli bir durumda yalnızca PartialUpdateB () yapmanız gerektiğini ve diğerlerinden kaçınarak verimli olduğunuzu anlayabilir (veya düşünebilirsiniz). iş. Bundan çok ve çok sayıda böcek kaynaklanıyor. Çoğu hata, yürütme durumunun tam olarak düşündüğünüz gibi olmamasından kaynaklanır.