Eski kodlar daha yeni dil yapılarını kullanacak şekilde güncellenmeli mi yoksa eski yapılara takılı kalmalı mı?


15

Uzun zaman önce yazılmış bazı fonksiyonel kodlarda, programlama dilinde yazılmadan önce bazı özellikler geliştirmek istiyorum. Teorik olarak, tüm proje dilin güncel versiyonunu kullanır; ancak, bu özel modül (ve aslında diğer birçok modül) hala eski lehçede yazılmıştır.

Yapmalımıyım:

  • Kodun dokunmak zorunda olmadığım kısımlarına dokunmuyorum, ancak yamayı yazmayı kolaylaştıran ancak modülün başka herhangi bir yerinde benzer durumlarda kullanılmayan yeni dil özelliklerini kullanarak yamam yazıyor mu? (Bu sezgisel olarak seçeceğim çözüm.)
  • Yılların geçtiğini görmezden gelin ve yamayı yazarken kodun geri kalanında kullanılan stili yansıtın, aynı görevi yıllar önce yapmış gibi etkili bir şekilde davranıyor musunuz? (Bu çözüm sezgisel olarak aptalca düşünürdüm, ancak “iyi kod” hakkında konuşan herkesin tutarlılığı her ne pahasına olursa olsun tutarlı kılmaya neden olduğu yaygara miktarı göz önüne alındığında, belki de bunu yapmalıyım.)
  • Daha yeni dil yapılarını ve kurallarını kullanmak için tüm modülü güncelleyin mi? (Bu muhtemelen en iyi çözümdür, ancak farklı bir göreve daha iyi harcanabilecek çok fazla zaman ve enerji gerektirebilir.)

1
@JerryCoffin Ben yorumlarda tartışmaya devam etmeyeceğim: Ben düzgün bir tartışma olabilir meta yayınlanmıştır .

Yanıtlar:


10

Bu soruya kesin bir cevap vermek imkansızdır, çünkü durumun ayrıntılarına çok fazla bağlıdır.

Kod temeli stilindeki tutarlılık önemlidir, çünkü kodun anlaşılmasını kolaylaştırmaya yardımcı olur, bu da sürdürülebilirliğin en önemli yönlerinden biridir.
Farklı stilleri karıştırarak kodun anlaşılmasını zorlaştırdığı için cehenneme lanetlenen ilk programcı olmazsınız. Küfretmeyi yıllar içinde yapan kendiniz bile olabilir.

Öte yandan, kod ilk kez yazıldığında var olmayan yeni dil yapılarının kullanılması, otomatik olarak sürdürülebilirliği azalttığınızı veya hatta kodun stilini kırdığınızı ima etmez. Her şey kullanmak istediğiniz dil özelliklerine ve ekibin hem kodun eski stiline hem de yeni özelliklere ne kadar aşina olduğuna bağlıdır.

Örnek olarak, tamamen OO tarzında bir kod tabanına haritalama / azaltma gibi fonksiyonel programlama kavramlarını tanıtmaya başlamak genellikle tavsiye edilmez, ancak burada ve orada kullanmayan bir programa lambda işlevi eklemek işe yarayabilir daha önce böyle bir şey.


1
Kısmen katılmıyorum. Açık kapanış ilkesine uymalıyız. Bu yüzden yeni kodu olabildiğince izole etmeye çalışmalıyız ve aynı zamanda yeni kodu mümkün olan en son dil yapısıyla yazmalıyız.
Anand Vaidya

3
@AnandVaidya: IMHO gerçekçi olmayan bir beklentidir, çünkü eski kodun OCP'yi takip ettiğini varsayar veya nadiren durum olan veya çabaya değmez OCP'yi takip etmek için kolayca değiştirilebilir.
Doc Brown

1
Ocp dediğimde, oops ocp değil, genel olarak ocp. Temel olarak mevcut kodu mümkün olduğunca değiştirmemeye çalışın ve kendi kodunuzu izole edin. Eski prosedür koduyla bile bu mümkün. Spagetti kodlarının bu şekilde değiştirilemeyeceğini anlıyorum, ancak herhangi bir paradigmada iyi tasarlanmış kod için açık kapanış kolayca uygulanabilir olmalıdır. Ayy, usul ya da işlevsel olsun.
Anand Vaidya

2
@AnandVaidya: OCP'yi kastetmediğinizde, bunu bu şekilde aramamalısınız. Gerçekten ne demek istediğini Feather'ın bir filiz yönteminde yeni kod yazma çağrıları olduğunu tahmin , böylece bir yeni kod stili yeni, ayrılmış bir yöntemle sınırlayabilirsiniz. Bu mümkün ve mantıklı olduğunda, haklısınız, bu iyi. Ne yazık ki bu yaklaşım her zaman geçerli değildir, en azından eski kodu KURU tutmak istiyorsanız değil.
Doc Brown

@DocBrown: Açık / kapalı prensibinin nesne yönelimli programlama ile sınırlı olduğunu düşünmüyorum. Yeni yordamlar eklediğiniz ancak var olanları değiştirmediğiniz modüllere sahip olabilirsiniz, yani mevcut kodun anlambilimini koruyorsunuz ve yeni işlevlere ihtiyacınız varsa yeni kod yazıyorsunuz.
Giorgio

5

Büyük ölçüde, kod ve nasıl göründüğü önemsizdir . Kodun yaptığı şey önemlidir.

Eğer Eğer garanti değişen o / FEC kod ne yaptığını değişmeyecek, o zaman devam edin ve kalbin içeriğiyle kodunu planı ayrı. Bu "garanti", değişikliklerinizden önce ve sonra gerçekleştirebileceğiniz, algılanabilir bir fark olmadan kapsamlı bir birim test setidir.

Eğer bu istikrarı garanti edemezseniz (bu testleri yapmadıysanız), o zaman rahat bırakın.

Hiç kimse, onu daha iyi hale getirmeye çalışsanız bile, iş açısından kritik öneme sahip bir yazılımı "kırdığınız" için size teşekkür etmeyecektir. "Çalışma" her seferinde "daha iyi" koyar.

Tabii ki, böyle bir egzersize hazır olmak için böyle bir dizi test oluşturmanızı engelleyecek bir şey yok ...


4

Neredeyse her şey maliyetler ve faydalar açısından analiz edilebilir ve bence bu burada geçerlidir.

İlk seçeneğin bariz faydaları, kısa vadede işi en aza indirmesi ve çalışma kodunu yeniden yazarak bir şeyi kırma şansını en aza indirmesidir. Bariz maliyet, kod tabanına tutarsızlık katmasıdır. Bazı X işlemlerini yaptığınızda, kodun bazı bölümlerinde bir şekilde ve kodun farklı bölümlerinde farklı bir şekilde yapılır.

İkinci yaklaşım için, bariz faydayı zaten fark ettiniz: tutarlılık. Bariz maliyet, yıllar önce terk etmiş olabileceğiniz şekillerde çalışmak için zihninizi bükmeniz ve kodun sürekli okunamayacağıdır.

Üçüncü yaklaşım için, bariz maliyet çok daha fazla iş yapmak zorunda. Daha az belirgin bir maliyet, çalışan şeyleri kırabilmenizdir. Bu, özellikle (genellikle olduğu gibi) eski kodun doğru çalışmaya devam etmesini sağlamak için yetersiz testlere sahip olması durumunda mümkündür. Bariz fayda, (başarılı bir şekilde yaptığınızı varsayarak) güzel, parlak yeni bir kodunuz olmasıdır. Yeni dil yapıları kullanmanın yanı sıra, dili tam olarak yazıldığı gibi hala kullansanız bile, neredeyse her zaman kendi başına iyileştirmeler sağlayacak olan kod tabanını yeniden düzenleme şansınız vardır. iş daha kolay ve büyük bir kazanç olabilir.

Yine de bir başka önemli nokta: şu anda, bu modülün uzun bir süredir minimum bakım yaptığı görülüyor (bir bütün olarak proje sürdürülmesine rağmen). Bu, oldukça iyi yazılmış ve nispeten hatasız olduğunu gösterir - aksi takdirde, geçici olarak daha fazla bakım geçirirdi.

Bu başka bir soruya yol açar: şu anda yaptığınız değişikliğin kaynağı nedir? Genel olarak hala gereksinimlerini iyi karşılayan bir modüldeki küçük bir hatayı düzeltiyorsanız, bu, tüm modülün yeniden yapılandırılması için harcanan zaman ve çabanın büyük olasılıkla boşa harcanacağını gösterecektir - birisinin uğraşması gerektiğinde yine, "modern" beklentileri karşılamayan kodu koruyarak, şu anda bulunduğunuz pozisyonda olabilirler.

Bununla birlikte, gereksinimlerin değişmesi de mümkündür ve bu yeni gereksinimleri karşılamak için kod üzerinde çalışıyorsunuz. Bu durumda, ilk denemelerinizin mevcut gereksinimleri gerçekten karşılamaması olasıdır. Ayrıca, gereksinimlerin tekrar dengelenmeden önce birkaç tur revizyona girme şansı da oldukça yüksektir. Bu, (nispeten) yakın vadede bu modülde önemli bir iş yapma olasılığınızın çok daha yüksek olduğu ve yalnızca doğru olduğunu bildiğiniz tek bir alanda değil, modülün geri kalanında değişiklik yapma olasılığınızın çok daha yüksek olduğu anlamına gelir şimdi. Bu durumda, tüm modülü yeniden düzenleme işleminin, ekstra çalışmayı haklı kılacak somut, kısa vadeli faydalara sahip olma olasılığı daha yüksektir.

Gereksinimler değiştiyse, ne tür bir değişikliğin söz konusu olduğuna ve bu değişikliği neyin tetiklediğine de bakmanız gerekebilir. Örneğin, Git'i SHA-1 kullanımını SHA-256 ile değiştirmek için değiştirdiğinizi varsayalım. Bu, gereksinimlerdeki bir değişikliktir, ancak kapsam açıkça tanımlanmıştır ve oldukça dardır. SHA-256'yı doğru bir şekilde saklayıp kullandıktan sonra, kod tabanının geri kalanını etkileyen diğer değişikliklerle karşılaşmanız olası değildir.

Diğer yönde, küçük ve ayrık bir şekilde başladığında bile, bir kullanıcı arayüzündeki bir değişiklik balonlaşma eğilimindedir, bu nedenle "bu ekrana yeni bir onay kutusu ekle" olarak başlayan şey daha çok şu şekilde sonuçlanır: kullanıcı tanımlı şablonları, özel alanları, özelleştirilmiş renk düzenlerini vb.

Önceki örnek için, tutarlılık tarafındaki değişiklikleri ve hataları en aza indirmek muhtemelen en mantıklıdır. İkincisi için, tam yeniden düzenlemenin ödeme yapması çok daha olasıdır.


1

Senin için ilk seçenek. Ben kod zaman ben daha iyi bir durumda bırakmak için kuralı takip o zaman oldu.

Bu yüzden yeni kod en iyi uygulamaları takip eder, ancak üzerinde çalıştığım sorunlarla ilgisi olmayan koda dokunmayacağım. Bunu iyi yaparsanız, yeni kodunuz eski koddan daha okunabilir ve bakımı yapılabilir olmalıdır. Toplam sürdürülebilirliğin daha iyi olduğunu gördüm, çünkü bunu devam ettirirseniz, işiniz için dokunmanız gereken kod gittikçe daha sık "daha iyi" koddur. Bu da sorunun daha hızlı çözülmesine yol açar.


1

Cevap, diğer pek çok şey gibi, duruma bağlı . Eski yapıları güncellemenin büyük avantajları varsa, büyük ölçüde geliştirilmiş uzun süreli bakım (örneğin geri arama cehenneminden kaçınma) gibi. Büyük bir avantaj yoksa, tutarlılık muhtemelen arkadaşınızdır

Ayrıca, iki stili aynı işleve, iki ayrı işlevde olmasını istemediğinizden daha fazla katıştırmak istemezsiniz.

Özetlemek gerekirse: Son kararınız, davanızın 'maliyet' / 'fayda' analizine dayanmalı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.