Yeniden düzenleme: Kodunuzu temizlemek için sadece süslü bir kelime değil mi? [kapalı]


21

Martin Fowler'in "Yeniden Düzenleme: Mevcut Kod Tasarımını İyileştirme" adlı kitabının çıkmasından önce, "rearchitecture" ve küçük değişiklikler "temizleme" kodlarında büyük değişiklikler yapmak için kullanılır. IMO, refactoring tekniklerinin tümü, sonsuza dek yaptığımız genel duyusal / açık şeylerdir.

Yeniden yapılanmanın yeni bir şey olduğunu düşünüyor musunuz? Belki de kodu temizlemeye zaman ayırmak için yönetimi kandırmanın bir yolu olabilir mi?


"Kitap çıkmadan önce" dediğinizde, Martin Folwer'ın kitabına atıfta bulunduğunuzu düşünüyorum.
AlexC

-1: Bu sorunun faydası nedir?
Jim G.

Evet Fowler'ın kitabı.
Chuck Stephanski

Yanıtlar:


43

Yeniden düzenleme, tepelerden daha eski, bu yüzden hayır, yeni bir şey değil.

Ve yeniden yapılanma temizlemiyor. Öyle olabilir, ama temizlikle sınırlı değil.

Davranışınızı korurken, uygulamanızın mimarisini (büyük veya küçük ölçeklerde olsun) ayarlıyor.

Bu, uygulamanızın bir kısmının dün tamamen temiz ve iyi olmasına rağmen, bugünün yeni özelliğinin, bu parçanın yeni özelliğe uyması için ayarlanması gerektiği anlamına gelir.

Var olan işlevselliği bozmak istemezsiniz, bu nedenle davranışınızı korurken uygulamanızın yapısını değiştirirsiniz - ki bu yeniden canlandırıcıdır.

Bu, kodda ne gibi değişiklikler yapıldığına bakılmaksızın, birinin her zaman testlerini yapması gerektiğini söyledi.


1
Newtopian: Bu hayati bir nokta. Testlerinizi yapmadıysanız, rastgele bir şeyi hacklediniz veya gerçekten düzeltilmiş olup olmadığınızı bilmiyorsunuz . (Ve tabii ki, yeterli bir test odasına ihtiyacınız var!)
Frank Shearar

9

Sadece kod toplama. Temel olarak, programcılar (özellikle Martin Fowler) kodlarını her düzenlediklerinde aynı görevleri yapma eğiliminde olduklarını fark ettiler. Toplama yöntemlerini ve ilgili kod problemlerini tanımladılar ve etiketlediler! Refactoring doğdu.

Tasarım desenleri ile aynıdır - insanlar aynı sorunları belirli problemlere tekrar tekrar kullanma eğiliminde olduklarını fark ettiler. Yaklaşımları etiketlediler ve tanımladılar ve şimdi kodunuzda yalnızca aynı düzine örneği kullanmıyorsanız gerçek bir programcı değilsiniz gibi görünüyor.

Refactoring için sihir yok; Eski bir uygulamayı tanımlamak için sadece yeni bir jargon seti.


William Opdyke, 1992: Nesneye Yönelik Çerçeveleri Yeniden Düzenleme . Fowler ve Beck ve arkadaşları refactoring'i popüler hale getirdiler. Jon Brant ve Don Roberts, ilk otomatik aracı 1999'dan bir süre önce uyguladılar. Dolayısıyla, “yeni jargon seti” pek doğru değil.
Frank Shearar

Bilgisayar programcılığının 1800'lerin ortalarında Ada Lovelace'den beri devam ettiğini kabul ederseniz, evet - nispeten yeni bir jargon dizisidir.
Ant

1
Farkın Tasarım Kalıpları ile olduğunu düşünüyorum, hemen hemen her geliştirici bazı yeni kalıplar öğrendi ve bu yüzden kitabın ticaretinin yeni araçlarını öğrendi. Refactoring ile kimsenin gerçekten bir şey öğrendiğini hissetmiyorum. Bir şeye sadece bir isim koymada ikincil bir değer var (ve tasarım deseni karşılaştırması orada kalıyor) ama o bunu bir blog yazısı ile yapabilirdi.
Chuck Stephanski

Gerçekten de, lambda matematiğine göre yeni bir jargon olduğunu söyledim.
Frank Shearar

@Chuck, kitabı okudun mu Refactoring? Öyleyse , ondan yeni bir şey öğrenmeseydiniz çok şaşırırdım .
Marcie

7

Şirketimizde üçe ayrılan zamanla üç ayrı şey yapıyoruz:

  • Yeniden düzenleme: kod yapısını değiştirmeyi içerir, böylece davranışı korur.

Örnek: dört şeyi tekrar kullanılabilir dört yönteme dönüştüren çirkin ve okunamayan 100 satır yönteminin her biri 25 satır bölünmesi.

  • Temizleme: davranışını veya yapısını değiştirmeden kodu daha okunaklı hale getirmek için küçük değişiklikler yapmaktan oluşur.

Örnek: bu kodun artık gerekli olmadığından emin olduktan sonra yorumlanan kodu kaldırma

  • StyleCop / FxCop kurallarını zorlamak: kodun varsayılan StyleCop veya FxCop kuralları grubuyla eşleşip eşleşmediğini kontrol etmekten ve bu kurallarla uyuşmayacak şekilde değiştirmekten emin olmanız gerekir.

Örnek: ilave Culture.Invariantolarak string.Format(ya da daha fazla uygun olan başka bir kültür).

Yani benim durumumda, yeniden yapılanma temizleme işleminden çok farklı bir şeydir . Temizliyorum zaman, yine birim testler gerekmez: Kod önce çalışmış, eğer olacaktır temizleme sonra çalışır. Başka bir deyişle, boş bir satırı kaldırdığım veya kodun çalışmayı durduracağı konusunda bir yorum eklediğim için değil. Öte yandan, eski bir kodun karmaşık bölümlerini yeniden ele aldığımda bazı hatalar yapabilirim, bu yüzden yeniden yapılanmadan sonra birim testleri yapmalıyım.


4
Temizleme ve yeniden faktoring arasında temel bir fark olduğu konusunda hemfikir olmama rağmen, bu çizginin biraz bulanıklaştığı birçok durum vardır. Ölü bir sınıfın kaldırılması ve tüm başvuruların yöntem imzalarından veya geri kalan ilişkilerden "temizlenmesi" temizlik veya yeniden düzenleme olarak kabul edilir mi? Ayrıca çalışan ünite testlerinin isteğe bağlı olduğuna kesinlikle katılmıyorum. İşlerin nasıl kırılabileceği hakkında hiçbir fikrin yok. Bir istisna sonu kodunun mesaj dizisinde değişiklikler gördüm, çünkü birisi bazı hatalar üzerinde hareket etmenin ayrıştırmanın iyi bir fikir olduğunu düşünüyordu.
Newtopian

Newtopian'la aynı fikirdeyim, özellikle testleri tekrar yapmak zorunda kalmamam. Aslında, işlem başına bir defadan daha az sıklıkta çalışmayan otomatik bir test paketi bulunmalıdır . Temizleme veya yeniden düzenleme işleminden bağımsız olarak , sürüm kontrolü için bir kod değişikliğiniz varsa, testler çalışmalıdır.
kojiro

Herhangi bir temizlemeyi yaptıktan sonra daima tam bir derleme yapmalısınız - sadece boşluk olsa ve yorumlarınız değişse bile. Herhangi bir Python veya Makefile yazarına bu konuda sorun.
JBRWilkinson

3

Yeniden düzenleme, kodunuza bilgi ekler. Bir şeyin yanlış adlandırıldığını biliyorsanız, ona daha iyi bir ad verin. Bir şeyin daha iyi yapılabileceğini biliyorsanız, daha iyi bir şey haline getirin.

Daha iyi bir programla sonuçlanan, küçük ve büyük, pek çok adım.


3

"Yeniden düzenleme, kodunuzu temizlemek için süslü bir kelimedir" ancak "sadece" değil. İnsanlar bir sebepten ötürü süslü kelimeler kullanırlar: bazen akıllı görünmek istedikleri için ve bazen daha büyük veya daha kesin bir anlam ifade ettikleri için ve IMHO refactoring (bazen yanlış kullanılsa bile) genellikle ikincisine atıfta bulunur.

"Temizleme", "biraz biçimlendirmekten" "büyük parçaların yeniden yazılmasından" herhangi bir şey anlamına gelebilir.

"Yeniden düzenleme" özellikle "daha iyi bir tasarıma dönüştürürken aynı işlevi korumak için tasarlanmış kodda küçük artımlı değişiklikler" gibi bir şey anlamına gelir. Ve yaptığınız şeylerin türünde en iyi uygulamaların bir kısmı vardır: bazıları geçicidir, ancak birim testleri kullanmak, işlevlerin bir bölümünü yeni işlevlere veya sınıflara çıkarmak, vb. İnsanların öğrenebileceği ve öğrenmesi gereken genel ilkeler vardır. .

"Yönetimi sadece kod temizliği için zaman ayırmak için kandırmak" diyorsunuz. Ancak “yeniden yapılanma” demek, net bir şekilde yapılan istikrarlı bir yatırımın gelecekteki verimlilik konusunda temettü ödeyeceği fikrini doğru bir şekilde aktarıyorsa, bu bir “hile” değildir, bu açık ve etkili bir iletişimdir.


2

Yeniden düzenleme, Normalizasyon, ilişkisel veri olarak kodlanır. Uygulamadaki rollerinin daha temiz, daha net ve daha verimli temsil edilmesine yönelik kavramları soyutlama sürecidir.


1
Buna bakmak için ilginç bir yol. Belki de veri tabanı geçmişimden geliyor, ama beni yeniden yapılanma stresiyle ilgili rahatsız eden bir şey var ve parmağımı üstüne koymama yardım ettin. Bir veritabanında tasarımda düzeltemediğiniz şeylerin testte düzeltilmesi 10 kat, üretimde ise muhtemelen 1000 kat daha uzun. Bu yüzden iyi bir DBA, olayları mümkün olduğu kadar erken bir aşamaya sokmak konusunda analdır. İçimdeki his, sonraki aşamalarda yeniden yapılanma için çok fazla zamanın, tasarım için çok az zaman harcadığının bir göstergesi olduğudur.
user21007

@ user21007: Kod, bir veritabanı şemasından çok daha karmaşık, ancak değiştirilmesi ve dağıtılması çok daha kolay.
kevin cline

1

Yeniden yapılanma terimini nasıl anladığınıza bağlıdır. Çoğu insan için bu, davranışı değiştirmeden yapıyı geliştirme sürecidir. Kabul ederseniz, evet bu kitap çıkmadan çok önce yapıldı. Biliyorum, çünkü (pek çok şey arasında) sınıfları yeniden adlandırıyordum, kitap yazmadan önce sınıfları çıkarıyor ve yöntemleri çıkarıyordum. Buna refactoring demiyordum, ama özünde aynısını yapıyordum.

Benim için kişisel olarak yeniden düzenleme, insanların artık "otomatik kod yeniden düzenleme" dediği şeydir; yani: bir IDE içindeki çeşitli yeniden düzenleme teknikleri için destek. Bu daha önce ne yaptığım konusunda gerçek bir gelişme (gerçekten çok acı verici). Bir sınıfta değişiklik yapabilir ve bunun yazılımın geri kalanını nasıl etkileyeceği konusunda endişelenmiyorum. Martin, refactoring tekniğini algoritma olarak gösterilebileceği noktaya kadar resmileştirdi ve böylece çeşitli IDE'lerde uyguladı.

Yani yeniden işlemeyi bir süreç olarak anlarsanız, o zaman yeni bir şey değil. Bunu otomasyon olarak görüyorsanız, evet, bu büyük bir gelişmedir. Nedenini görmek için oldukça büyük bir projede birkaç temel sınıfı (kelimenin tam anlamıyla, IDE'nizin seçeneklerini gözden geçirerek değil) yeniden adlandırmayı deneyin :)


0

Yeniden düzenleme, gerçekten de "temizleme" kodudur, aynı zamanda kodu da yeniden yapılandırmaktadır. Benim takımımda refactoring genellikle ikincisidir. Bir "refactor" vakası olduğunda, kodumuzu yeniden yapılandırmak için zaman ayırırız, örneğin yeni bir mimariye veya bilgi modeline göre ayarlamak veya daha verimli hale getirmek için.

"Temizleme" kodu, bunun için özel olarak zaman ayırmadan sürekli olarak yaptığımız bir şeydir. Benim için "temizleme" genellikle yeniden adlandırma, yorumları temizleme vb.


1
yeniden adlandırma, standart bir yeniden düzenleme tekniğidir!
Chuck Stephanski

0

Hayır derdim.

Yeniden düzenleme işleminde temizleme olabilir, ancak bu öz değildir.

Temizleme , önceki kodun temiz olmadığı varsayımıyla birlikte gelir. Gerçekte, geliştiriciler kodlarını yeniden değiştirirler, orijinal kod zaten temizdir.

DRY yeniden yapılanmanın ardındaki temel tahriktir.

Mevcut bir kod tabanına yeni kodlar eklenirken, DRY prensibi nedeniyle yeniden yapılanma doğal olarak yapılır.

Sadece benim 0.02


0

Kodunuzu temizlemek evinizi düzenlemek gibi bir şeydir, yeniden düzenlemek bir duvarı yıkmak ve muhtemelen başka bir yere koymak gibidir


0

Biri evinizi temizlediğinde, hiçbir şey bulamazsınız, çünkü amaç bir şeyleri temiz ve yoldan çıkarmaktır. Yeniden yapılanma, odaları, dolapları, dolapları, rafları, kutuları vb. İnşa eder ve etiketler. Hala aynı şeylerin çoğunu tutar (hala mutfakta bir peynirli sandviç yapabilir ve oturma odasında yiyebilirsiniz), ancak yapmalı Bulmak daha kolay ve muhtemelen yeni şeyler koymak için verimli yerler var.


Bilmece fanatiği değilim ama bazen ortak görevlerin etiketlenip resmileştirilmesi gerekiyor, böylece herkes neden bahsettiğinizi bilir. Bir müşteri bir hata bildirdi ve yönetici "Git kodunu temizle!" Diye bağırıyor. Yeniden yapılanma hakkında konuşmadıklarını biliyorsun.
JeffO

0

'Yeniden düzenleme' terimi zarif bir şekilde cebirden ödünç alınmıştır. Aynı sonucu elde etmek için terimlerin basitleştirilmesi demektir. Sadece zarif değil, devrim niteliğindeydi - kodunuzu zorlayan sonlu bir yaklaşım gerektiriyordu. Ve bu yüzden terimin kendisi önemli ve yardımcı oldu.


-1

Hayır. Yeniden düzenleme, davranışı değiştirmeden yapıyı iyileştirmektir. Tam anlamıyla yeniden yapılanma, iyi bir test disiplini gerektirir. "Bir şeyleri temizlediğinde" bunun gerekli olması gerekmez.


2
tehlikeli tutum Ölü kod ve ölü konfigürasyonun tamamının bir parçasını silmek, temizleyici ve tek bir yöntemin imzacısının imzasını değiştirmektir. Yine de her iki durumda da hiçbir şeyi kırmadığımdan emin olmak için iyi bir test disiplini almak isterdim.
Newtopian

Test disiplini olmadan büyük değişiklikler yapmanın iyi / güvenli / arzu edilebilir olduğunu söylemiyorum. Bir metodoloji olarak yeniden yapılanmanın test disiplini içerdiğini söylüyorum, oysa "eşyaları temizlemek" bir metodoloji değil.
Willie Wheeler

Doğru bir fantezi adı yoksa, doğru anlıyorsanız, o zaman biz gitmek iyi! : -Sadece şaka yapıyorum, ne söylemeye çalıştığınızı anlıyorum, şeyleri temizlemenin zor bir metodoloji olabileceği doğru ama yine de hiçbiri yeniden yapılanmıyor. Bu sadece davranışını değiştirmeden kodu değiştirdiğinizi belirten süslü bir kelime. Tek başına, herhangi bir şekilde test etmenin bir etkisi yoktur. İyi kodlama uygulamasının ardından, kod değiştiyse, değişikliği oluşturan eylemi nasıl çağırdığınıza bakılmaksızın test edilmesi gerektiğini belirtir.
Newtopian

1
Elbette, onu satın alabilirim. Test disiplini, yeniden yapılanmanın nasıl yapıldığına dair daha fazla şey ifade eder, ancak tanımda doğal değildir. (Yani, herhangi bir test yapmadan kodu yeniden kodlayabilirim.) Yeniden yapılandırmanın bir metodoloji olmadığı konusunda hemfikir miyim, bilmiyorum - adım adım desenlerle yazılmış tüm kitaplar var.
Willie Wheeler,

-1

İkisi kenarlarda biraz üst üste biniyor, fakat bana göre bu, ev temizliği ile evin yeniden şekillenmesi arasındaki fark. Temizleme, bana göre, yeniden yapılanma yaparken yapısal değişiklikler anlamına gelmez.


-2

"Yeniden düzenleme" gerçekten "yeniden arama" ile aynı şeydir, ancak "işlevsellik değişikliği olmaz" ifadesi daha güçlüdür. Aynı zamanda, yeniden kodlamanın amacı açısından da anlaşılır bir şeydir ve bu da çoğu zaman ortak kodu yeniden kullanılabilir parçalara dönüştürmek anlamına gelir.

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.