Kod bakımı: yeni kodun tutarlı olması için genişletilirken kötü bir kalıbı tutuyor musunuz?


45

Mevcut bir projenin modülünü genişletmek zorundayım. Yapılma şeklini beğenmedim (kopya / yapıştırma kodu gibi, çok sayıda anti-patern içeren). Birçok sebepten dolayı tam bir refraktör yapmak istemiyorum.

Yapmalımıyım:

  • Bir sonraki bakıcı için karışıklıktan kaçınmak ve kod tabanıyla tutarlı olmak için mevcut konvansiyonu kullanarak yeni yöntemler yaratmalı mıyım?

veya

  • Kodda başka bir desen getirse bile, daha iyi hissettiğim şeyi kullanmaya çalışın mı?

Precison ilk cevaplardan sonra düzenlendi:

Mevcut kod karışıklık değildir. Takip etmesi ve anlaması kolaydır. ANCAK iyi bir tasarımla kaçınılabilecek birçok kazan plakası kodu getirmektedir (sonuçta ortaya çıkan kod daha sonra zorlaşabilir). Şu anki durumumda eski bir JDBC (içten içe yerleştirilmiş ilkbahar şablonu) DAO modülü, ancak bu ikilemle zaten karşılaştım ve diğer dev geri bildirimleri arıyorum.

Yeniden ateşlenmek istemiyorum çünkü zamanım yok. Ve zamanla bile, kusursuz çalışan bir modülün yeniden düzenlemeye ihtiyaç duyduğunu haklı göstermek zor olacaktır. Yeniden düzenleme maliyeti faydalarından daha ağır olacaktır. Unutmayın: kod dağınık veya karmaşık değildir. Orada birkaç yöntem çıkaramıyorum ve buraya soyut bir sınıf getiremiyorum. Tasarımda daha fazla hata var (aşırı 'Aptal Basit Tutun' sonucu)

Böylece şu soru da sorulabilir:
Geliştirici olarak, aptal sondaj kodunu korumayı mı tercih edersiniz VEYA aptal sıkıcı kodunu yerine getirecek bazı yardımcılara sahip olmak ister misiniz?

Son ihtimalin dezavantajı, bazı şeyleri öğrenmek zorunda kalacağınız ve belki de tam bir yeniden yapılanma tamamlanana kadar kolay aptalca sıkıcı kodu da sürdürmeniz gerekmesidir.)


Çok ilginç bir soru!
Philippe,

1
Kolay sıkıcı aptal kodun korunması - tanımı gereği kolaydır. Kolay bir hayat sürmeyi ve her gün erken ayrılmayı tercih ederim.
Çabuk_şimdi

Evet, ama sıkıcı aptal kod yapmak için çok tembelim :) Bu bölümü benim için yapacak bir şey inşa etmek için 2 ya da 3 gün çalışmayı tercih ederim!
Guillaume

1
Aptal ya da sıkıcı ne zaman için kolay karıştı?
Erik,

Merhaba Erik, bazen çarpanlara ayrılan bir kodun okunması daha basittir: bir düzine zaman aynı şeydir ve kod basit. Düşünmeden üst üste okuyabilir ve doğrusal bir şekilde hata ayıklayabilirsiniz. Gizli bir karmaşıklık yoktur.
Guillaume

Yanıtlar:


42

Yeniden yapılandırma en iyi şekilde küçük adımlarla yapılır ve tercihen yalnızca kodu kapsayan birim testleriniz varsa. (Eğer henüz bir testiniz yoksa, ilk önce onları yazmaya çalışın ve o zamana kadar en basit, en kusursuz, tercihen otomatik yeniden ateşlemelere sadık kalın. Bu konuda en büyük yardım, Michael Feathers tarafından Legacy Code ile Etkili Çalışmaktır .)

Genel olarak, dokunduğunuzda kodu biraz iyileştirmeyi hedefleyin. Takip İzci Kural ( Robert C. Martin tarafından ortaya sen bulduğundan daha kod temizleyicisi bırakarak). Yeni kod eklediğinizde, mevcut kötü koddan ayrı tutmaya çalışın. Örneğin, uzun bir yöntemin ortasına gömmeyin, bunun yerine ayrı bir yönteme bir çağrı ekleyin ve yeni kodunuzu buraya yerleştirin. Bu yolla, mevcut kod temeli içinde giderek daha büyük temiz (er) kod adaları büyür.

Güncelleme

Yeniden düzenleme maliyeti faydalarından daha ağır olacaktır. [...] Geliştirici olarak, aptal sondaj kodunu korumayı mı tercih ediyorsun VEYA aptal sıkıcı kodunu yerine getirecek bazı yardımcılara sahip olmak için mi?

Hangisinin burada kilit nokta olduğuna inanıyorum. Yeniden yapılanmaya başlamadan önce yeniden yapılanmanın maliyetlerini ve faydalarını değerlendirmeye değer . Sizin durumunuzda olduğu gibi, çoğumuz refactoring için sınırlı kaynaklara sahip, bu yüzden bunları akıllıca kullanmalıyız. En az çabayla en fazla faydayı sağladığı yere yeniden kıyma için bu değerli az zaman harcayın.

Yaratıcı bir zihin olarak elbette mükemmel, güzel ve zarif bir kod üretmeyi ve ideallerime benzeyen her şeyi yeniden yazmayı tercih ederim :-) Gerçekte, kullanıcıları için gerçek sorunları çözen bir yazılım üretmek için para alıyorum. Uzun vadede paralarının karşılığını en iyi şekilde üretmeyi düşünmeli.

Yeniden yapılanmanın faydası, yalnızca zaman içinde yeterli tasarruf ve kodun uzun vadede anlaşılması, korunması, düzeltilmesi ve genişletilmesi çabalarında ortaya çıkar . Bu nedenle, bir kod parçası - çirkin olsa da - nadiren veya hiç dokunulmazsa, içinde bilinen bir hata yoktur ve öngörülebilir gelecekte ona dokunmamı gerektiren gelecekteki özellikleri bilmiyorum, bırakmayı tercih ederim Huzur içinde.


7
Tuzak içine düşmek çok kolay 'kod zaten berbat, devam etse de devam edebilir ...' İyi programcılar yok. Güzel cevap
sevenseacat

Her ne kadar en olası yaklaşım bu olsa da (testler sayesinde kodun çalışması garantilidir) yine de soruda belirtilen soruna yol açar. Koda farklı bir desen girilir. Genel olarak, her şeyi tek seferde yeniden incelemek için zaman ayırmaya çalışmanız gerektiğine inanıyorum (TDD yaparken, en iyi ara adımlar ile), o nedenle bu orta tutarsız duruma sahip değilsiniz. İşiniz bittiğinde, kodunuzu kaynak kontrolüne verin.
Steven Jeuris

2
@Steven, gücünüzü karşılayabiliyorsanız her şeyi tek seferde yeniden yönlendirmek iyidir . Gerçekte çoğu gerçek yaşam projesinde, her şeyi durduramaz ve birkaç gün veya haftayı arka arkaya sadece refactor için geçiremezsiniz. Bunu destekleyen bir menajere sahip olduğunuz için şanslıysanız bile, projenin devam etmesi gerekiyor.
Péter Török

1
@Steven, duruma göre değişir - yukarıdaki güncellememe bakın.
Péter Török

1
@ Péter Török: Güzel güncelleme! Dikkate alınacak gerçek dünya faktörlerinin mükemmel tanımı.
Steven Jeuris,

4

Yeniden aktive etmek için zamanınız olmadığından ve kod korunabilir olduğundan, tutarlı tutun. Bir dahaki sefere tahminlere yeniden yapılanmayı dahil ettiğinizden emin olun.


3

Tutarlı olmak, yalnızca çevredeki kod iyi durumda olduğunda bir sonraki geliştiriciye yardımcı olur. Elinizdeki kodu anlamanızın ve değişikliklerinizi eklemek için doğru "uzatma noktalarını" bulmanızın ne kadar sürdüğünü düşünün. Mevcut trendi takip ederseniz, bir sonraki adam değişiklik yapmak zorunda kaldığında mevcut kodu ve yeni kodunuzu anlamak zorundadır.

Kodu anlamlı işlevlere dönüştürürseniz, bir sonraki adam ne olduğunu anlamak için daha kolay bir zaman geçirir ve değişikliklerini eklemek için daha az çaba harcayacaktır. Bu şekilde düşün. Bir sonraki adamın sen olduğunu varsayıyorum. Bu kod bloğunu, şu anda bakmakta olduğunuz karmaşayı veya daha mantıklı bir şekilde yapılandırdığınız şeyi tekrar ziyaret ederken ne görmeyi tercih edersiniz?


3

Tutarlılık yüksek önceliğe sahiptir. Açıkçası aklı başında herkesin her yerde kopyalanıp yapıştırılan Demirbaş her yerde yerine zarif KURU çözümü tercih ediyorum, ama sen gerçekten tutarlı bir şekilde uygulanan birine sahip aynı kod temeli iki farklı yaklaşım tercih edersiniz? Birisi daha akıllı bir çözüm geliştirirse ve tutarsızca uygularsa ne olur? O zaman aynı şeyi yapmanın üç farklı yolunu buluyorsun.

Geliştiricilerin bir şey yapmanın "daha iyi bir yolunu" bulmalarından kaynaklanan çok karışık bir kod gördüm, ancak bunu sürekli olarak bir kod temeli üzerinde uygulamadım. Zaman içinde kademeli olarak yeni bir model uygulamak planlı ve koordineli bir stratejinin parçası ise işe yarayabilir, ancak tutarsız bir şekilde uygulanan her model genel sistemi daha kötü hale getirme riskine sahiptir.

Belki daha küçük adımlarla yeniden düzenlemeyi düşünebilirsiniz, böylece her adım bir kerede kod kodunun tamamına uygulanabilir. Örneğin. Her bir yinelemede, kazan plakasının daha küçük bir kısmını bir yardımcı fonksiyona çıkarmak. Zamanla bir yardımcı sınıftaki tüm kazan plakasıyla bitiyorsunuz. Gerçekten çirkin görünebilir çünkü tasarlanmadı ama büyüdü, ancak tüm kodu bir yerde bulunduğundan bunu düzeltebilirsiniz.


+1 "O zaman aynı şeyi yapmanın üç farklı yolunu kullanıyorsunuz." Bunu çalıştığım her işletme projesinde gördüm. Yeniden denemek istediğine karar verdiğin çirkin kodun icabına bakmaya çalışan başka bir kod parçası olmadığından emin olmak için kodu tarayana kadar yeniden ateşlemeye çalışmayın derim. Bazen en azından kodu eksiksiz bir şekilde okuyana kadar, yalnızca kazan konvansiyonu kurallarına uymak en iyisidir.
TK-421

1

Yinelenen kodu ortadan kaldıran herhangi bir yeniden düzenleme, iyi bir yeniden düzenlemedir ve son tarih gelmediği sürece ertelenmemelidir. Bir kez yeniden yapılanmaya harcanan zaman, gelecekteki uygulamalarda kazanılan zaman için kolayca hazırlanır. Yeniden yapılanma sayesinde iç işleyiş artık görünmüyor, bu yüzden izlemesi zor değil, anlaşılması daha kolay olmalı.

Kanımca, yanlış kodlanan kodun takip edilmesinin zor olduğu yaygın bir yanılgıdır. Bu genellikle, yalnızca yeniden yapılandırılmış olana aşina olan ve yeniden yapılanmış sonucu olmayan insanlarla ilgili bir argümandır. Yeni gelenler için, yeniden alevlenen sonuç daha net olacaktır.

Herhangi bir hata / özellik daha sonra merkezi bir yerde sabitlenebilir / uygulanabilir ve uygulamanızın her yerinde otomatik olarak kullanılabilir. Bu, genellikle oldukça hafife alınan büyük bir kazançtır. Genel olarak, bir bileşenin tamamen yeniden yapılandırılması o kadar uzun sürmez. (aylar yerine günler) Bunu, hatalar nedeniyle kaybedilen zamanla karşılaştırarak, yeniden yapılandırılmış olabilecek kodu anlamak zorunda kaldığınızda, yeniden yapılanmanın maliyeti minimum olur.

Péter Török'ün cevabı ile ilgili güncelleme: Yeniden ateşlemeyi erteleyerek değil mi, çünkü "zaman alır", daha sonra yeniden ateşleme zamanı artar mı? Yeniden yapılanma, daha sık yapıldığında uzun sürmemelidir.

Patronunuza, ürüne hiçbir şey eklemeyen, kod yazmak için birkaç gün harcayacağınızı, zordur ve tamamen farklı bir sorudur. :)


1
“Patronunuza, ürüne hiçbir şey eklemeyen, kod yazmak için birkaç gün harcayacağınızı, zor olduğunu ve tamamen farklı bir soru olduğunu nasıl açıklayacağınızı” açıkladı. Güzel deneme ;-) Ne yazık ki gerçek hayatta da bunu çözmemiz gerekiyor. Bu yüzden küçük adımlarla ilerlemek daha pratik. Yarım saatlik yeniden yapılanma, iki saatlik bir görevin bir parçası olarak yapılabilir, yöneticiniz bunu bilmesine bile gerek kalmadan yapılabilir. OTOH refactoring'de harcanan iki tam gün nadiren fark edilmez.
Péter Török

@ Péter Török: Mesajı biraz güncelledim. Elbette hala yeniden yapılanma için zaman ayırmadığınız gerçek dünya durumlarınız var. Fakat teoride daima zaman kazanıldığına kuvvetle inanıyorum . (Çalıştığınız kodun yakın gelecekte artık desteklenmeyeceğini bilmiyorsanız)
Steven Jeuris

Dedikleri gibi, teoride pratik ile teori arasında fazla bir fark yoktur. Ancak, uygulamada ... :-) Gerçek hayatta her zaman yeniden yapılanmaya harcanan bedeli geri alamayabilirsiniz. Buna cevabımı uzattım.
Péter Török

1
Çoğaltılmış kodu kaldıran yeniden düzenleme her zaman iyi değildir; İki yöntem bugünün iş kuralları altında aynı olabilir, ancak bu yarının değil. Örneğin, bir AcmeLockerBanktek bir olabilir getRow(int itemIndex)döner yöntemi index % 5, bir ve AcmeButtonPanelaynı yöntem olabilir dolap ve düğme panoları hem sayı şeyler aynı şekilde, çünkü; Bugünün soyunma bankalarının hiçbirinde 1000'den fazla endeksi olmayan öğeler yoksa bazı düğme panelleri kullanıyorsa ve gelecekteki kilitli dolaplar 1000-1999 aralığında endeksler için farklı bir satır aralığı kullanıyorsa ...
supercat

1
... soyunma bankalarına ek davranışlar eklemek, soyunma bankaları ve düğme bankalarının farklı getRowyöntemlere sahip olması durumunda kolay olacaktır , ancak işlevler ortak bir yönteme birleştirildiğinde daha zor olabilir.
supercat

0

Eski kodun üzerinden Cephe olarak çalışan, yeni kodunuzu kolayca genişletilebilecek kendi stilinizde tanıtırken yeni bir Arayüz / Sınıf oluşturamaz mısınız?


0

İleriye doğru gidiyor. Kesme ve yapıştırma yerine işlevleri kullanın. Bu yeniden düzenleme gerektirmez, ancak size gelecek yeniden düzenleme için bir vakfın başlangıcını verir.


0

Siz, geliştirici olarak, kolay aptal sıkıcı kodu korumayı mı tercih ediyorsunuz VEYA aptal sıkıcı kodunu yerine getirecek bazı yardımcılara sahip olmak için mi?

Değiştirilen soruyu anlamıyorum. Sanırım çoğu insan, kendim gibi, "aptal sıkıcı kodu" sürdürmemeyi tercih ediyor. Yardımcı derken ne demek istediğini anlamadım, üzgünüm.

Poster şu anda büyük değişiklikler yapmadan kendi sorularına cevap verdi. İyi seçim. Bir geliştiricinin, iş için neyin en iyi olduğunu bildiği iddiasıyla ilgili sorunlarım var. Kurnazlıkta büyük bir yeniden ateşleme ... çünkü patronundan daha iyi biliyorsun? Herhangi bir yetenekli yönetici faydaları değerlendirebilir.

Yeniden yapılanma bir seçenek değilse, soru, bunu yapmak için doğru zaman, yer vb. Hakkında daha fazla tartışma olur. Tutarlılık çok önemlidir. Yine de uzun ömürlü kod genellikle "yenileme" den yararlanır. Diğerleri bunu tartıştı ...

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.