Hem şelale hem de Çevik'te yeniden düzenleme ve optimize etme ihtiyacını yöneten bir kapsayıcı prensip vardır: YAGNI (Buna ihtiyacınız olmayacak). İkinci ilke birincinin sonucudur: "Erken optimizasyon tüm kötülüğün köküdür", genel atasözünün kodlama eşdeğeri "mükemmellik düşmanı mükemmelliktir".
Hadi prensipleri alıp uygulayalım. Belirli bir türdeki bir dosyayı alan, bilgilerini ayıklayan ve sonra bu bilgileri bir veritabanına koyan bir ETL algoritması oluşturma gereksiniminiz vardır. Bu haftaki amacınız (bizim amacımız için bir Agile veya SDLC mağazasında olmanızın önemi yoktur) bunu yapmaktır.
Sen akıllı bir adamsın ve sana büyük resme bir göz attı. Bunun, projenin bir ETL'ye ihtiyaç duyacağı tek dosya türü olmadığını biliyorsunuz. Bu nedenle, bu ETL algoritmasını, yalnızca küçük farkları olan başka bir dosya türü üzerinde de çalışmak üzere uygulamayı düşünürsünüz. Bunu yapmak YAGNI'yi ihlal edecektir. İşiniz o diğer dosya için algoritma geliştirmek değil; hafta sonunda ihtiyaç duyulan bir dosya için algoritma geliştirmektir. Bu hedefe ulaşmak ve kabul testlerini geçmek için, bu algoritmayı geliştirmeniz ve doğru çalışmasını sağlamanız gerekir. Diğer dosyayla çalışmasını sağlamak için ek koda "ihtiyacınız olmayacak". Şimdi dahil etmeniz için zaman kazanacağınızı düşünebilirsiniz ve haklı olabilirsiniz, ancak çok yanlış olabilirsiniz; diğer dosya için algoritmanın kodunuzun kullanılamadığı bir alanda kullanılması gerekebilir veya yeni dosya için gereksinimler sizin bilmediğiniz yollardan sizinkinden farklı olabilir (Agile'da, bunlar gereksinimler henüz mevcut olmayabilir). Bu arada, zaman kaybettiniz ve algoritmanızın karmaşıklığını gereksiz yere artırdınız.
Şimdi, gelecek hafta ve ilk algoritmadaki mükemmel çalışmanız için şüpheli bir ödül olarak, iki yeni dosya türü için algoritmalar oluşturma görevi verildi. Şimdi, algoritmanızın daha fazla dosyayla çalışmasını sağlamak için ek koda ihtiyacınız var. Varolan algoritmanızı, dosyaya özel ayrı adımlarla temel bir desen kullanacak bir şablon yöntemi deseni kullanarak genişletebilir veya mevcut algoritmanızdan ortak bir arabirim türeyebilir, arabirimi izleyen iki yenisini geliştirebilir ve bunları takabilirsiniz. hangi algoritmanın kullanılacağını seçebilen bir nesne.
Gelişirken, sistemin saniyede 10KB ham veri işleyebilmesi gerektiğini biliyorsunuz. Bir yük testi yapın ve ilk taslak algoritmanızın 8KB / s tutamaçlarını bulun. Bu AAT'leri geçmeyecek. Bir bakıyorsunuz ve algoritmanızda O (benim Tanrım) karmaşıklık döngüsü yapısının olduğunu görüyorsunuz; düzene sokar ve 12KB / s alırsınız. "Oldukça iyi" diye düşünüyorsunuz, "ama kodda bu kadar zayıf bir döngü olsaydı, başka ne tıraş olabilirim?". buzz "Erken optimizasyon" kuralını ihlal ettiniz. Kodunuz çalışır ve tüm gereksinimleri iletir. Gereksinimler 15KB / s gerektirecek şekilde güncellenene kadar "bitti". Bu olduğunda ve sonra, kodu geri çekin ve iyileştirilecek şeyler arayın.
İster Agile'de ister geleneksel SDLC'lerde olsun, bu basit süreci takip edin: "İlk geçişte, çalışmasını sağlayın. İkinci geçişte güzelleştirin. Üçüncü geçişte SOLID yapın." Bunun anlamı, bir kod satırı ilk oluşturduğunuzda, bu kodun işini doğru ve hatasız yapmasını sağlayın, ancak şu anda bildiğiniz her şey için olduğu gibi, bu koddaki tasarım kurallarına çok fazla dikkat etmeyin ' Bu alana bir daha asla dokunmayacağım. Bir dahaki sefere bu kod satırını ziyaret ettiğinizde, kendinizi yanlış buldunuz; artık sistemin tek seferlik bir parçası değil. Okunabilirlik, kodun kısa olması ve / veya KURU ilkeleri için yeniden düzenleyin (bir şeyi beş kez yapmak için bazı kodları kopyalayıp yapıştırmış olabilirsiniz; bunu bir döngüye ve / veya yöntem çağrısına dönüştürün). Bu kod satırında veya çevresinde üçüncü kez çalıştığınızda,
O(my God)-complexity
Başka bir şey yoksa +1 beni güldürdü!