Kopyalama / yapıştırma kalıbı nasıl düzeltilir?


16

Çalıştığım yerde, insanlar (danışmanlar) özellikleri olabildiğince hızlı yayınlamak için baskı altında hissediyorlar. Bu nedenle, işleri doğru şekilde nasıl yapacağınızı düşünmek için çok fazla zaman harcamak yerine, hiçbir şeyi kırmak istemedikleri için, kod farklı modüllerden kopyalanır ve değiştirilir.

Kod tabanı tüm şirkete açık olduğundan bunu önlemek kolay değildir. Birçok insan bu konuda çalışıyor.

Artık karışıklık zaten var, bu fazlalıkları çok fazla kırmadan kaldırmanın en iyi yolu nedir?


3
En sinir bozucu şey, kodun bir siteden kopyalanması / yapıştırılması ve ardından yorumların silinmemesi. Böylece bulabilirsiniz: "// O Carlo için teşekkürler" ... Ve onlara işaret ettiğinizde sadece gülerler ve "Bırak!))" Derler. Bu profesyonel ve üzgün değil !!!
CoffeeCode

2
sadece danışmanlar değil
AndersK

Yanıtlar:


14

Cevabın bir kısmı Yeniden Düzenleme .

Öncelikle, değişikliklerinizle yanlışlıkla bir şey kırmamanız için birim testleri yazmaya başlayın. Ardından, tasarımı geliştirmeye, kopyaları vb. Küçük adımlarla kaldırmaya, her adımdan sonra birim testlerinizi çalıştırmaya, testlerden herhangi biri başarısız olursa herhangi bir sorunu çözmeye veya kolayca çözebileceğinizden daha büyük bir sorunla karşılaşırsanız hemen geri dönmeye başlayın.

Diğer kısım eğitimdir .

İnsanlara kötü kodları geride bırakmamaları öğretilmelidir. Bu kesinlikle uzun vadeli bir savaştır, çünkü alışkanlıkların ve düşünce süreçlerinin değiştirilmesi zor (bazen imkansız) . Bununla birlikte, onsuz, yeniden düzenlenmesi için çığlık atan sonsuz bir kötü kod kaynağı almaya devam edeceksiniz.

İyi ve kötü kodlama alışkanlıkları hakkında tartışma açmak ve birincisinin yararlarını yaymak için grup kodu incelemeleri yapmayı seçebilirsiniz. "Böyle kod yazmalısınız (söylememelisiniz) demek yeterli değildir, insanları mantık ve zor gerçeklerle ikna etmeniz gerekir. Gibi "Eğer varsa yöntemin bu parça kod tabanına üzerinde çoğaltılamaz n defa, sen şansını bir hata olduğunu yöntemde bulunursa, bu yöntem kodunun her kopyasında sabit olacağını ne düşünüyorsunuz?"

Şirketinizin ayrıca danışmanlar için teşvik ve kabul kriterlerini gözden geçirmesi gerekebilir - özensiz kod yazarak kurtulabilirlerse, kesinlikle daha kolay yolu seçmeye devam edecektir. Şirket uzun vadeli sürdürülebilirlik üzerinden "hızlı teslimat" değer vermeye devam ederse, hiçbir şey değişmeyecek: --( Bu yüzden yönetimi ile de tartışmak gerekebilir. Onları anlamak için bir yolu şudur: yeniden düzenleme kodu temiz tutmak, Yeniden düzenleme yapmamak, kredi kartınıza borç toplamak gibidir .. Bir süre bununla kurtulabilirsiniz, ancak satın alma alışkanlıklarınızı ve borçlarınızı aktif olarak yönetmiyorsanız, bir gün omuzlarınızda kaçınılmaz olarak parçalanacaktır. Bir yazılım projesinin hayatında iflas, projenin sürdürülemez hale geldiği zamandır: sıfırdan yeniden yazmak, mevcut kod tabanına yeni bir özellik eklemekten daha kolay hale gelir. Ya da kullanıcılar, sadece rekabete geçecekleri düşük seviyedeki destek ve özelliklerden bıkmış olurlar.


4
"Öncelikle, değişikliklerinizle yanlışlıkla bir şey kırmamanız için birim testleri yazmaya başlayın." Vay, frenleri oraya pompala. Gerçekten SE sitelerinde herkes bu hattı cevapsız nasıl atıyor sevmiyorum. Bunu anlamak son derece zordur ve bunu yapmasını öneren kullanıcıların% 99'u kadar rahat değildir.

@Sergio Tapia - doğru, ama onsuz refactor olamaz. 2011'e
yaklaşan

1
@Sergio, eski kod testini zorlaştırırsanız daha fazla anlaşamadım. Alıntılanan cümleyi "İlk olarak, birim testleri yazmak için zorlu ve stresli bir işe başlamalısınız ..." :-) olarak uzatmaktan mutluluk duyuyorum. Ancak, eğer birim testi zor olduğu için, kesinlikle katılmıyorum (teoriye değil pratik deneyime dayanarak). Eski kodu korumak için kraliyet yolu yoktur.
Péter Török

9

@Peter gibi eğitimin bir parçası olarak, PMD gibi bir kopyala ve yapıştır dedektörü tanıtabilir ve kodlama standartlarınızın bu kısmını uygulamaya yardımcı olmak için bunu çevriminizin bir parçası olarak kullanabilirsiniz.

Standartları kodlayan projelerinizin bu modeli kapsadığından emin olun, böylece tartışmaya başlamak için bir taban çizginiz olur.


1
Bunu beğendim, güzel olanı!
ozz

Yüklenicinin sözleşmesinde bir kodlama standardına bağlı kalmak gerekli mi?
Armand

1
@Alison İstediğiniz her şeye bağlı kalmanız gerekebilir, ön tarafta belirttiğiniz sürece sorun yaşamamanız gerekir. Yüklenici olarak çalıştığım şirketlerin sahip olduğu gelişme gereksinimlerine bağlı kalıyorum, bunlardan biri kodlama standartlarına uygun davranıyor.
Gövdeye

Teşekkürler, yazınızdan sonra ben de Python / Java için clonedigger.sourceforge.net bulundu .
LennyProgrammers

@ G3D mantıklı; çalışmak için bir kodlama standardına sahip olmayı sever misiniz? Kabul etmenin bir biçimi olarak kod incelemeleriyle ilgili sorunum, bir yüklenici olarak, kodun keyfi nedenlerle (örneğin politika veya bütçedeki değişiklikler) reddedilebileceğinden endişe duyacağım.
Armand

8

insanlar (danışmanlar) özellikleri mümkün olan en kısa sürede yayınlamak için baskı altında hissediyorlar

Teknik bir sorunun yok, sosyal bir sorunun var. Gerçekten de bir yönetim sorununuz var.

Kod tabanı tüm şirkete açık olduğundan bunu önlemek kolay değildir. Birçok insan bu konuda çalışıyor.

"Kod tabanı tüm şirkete açık" bir sorun değil. Önemli değil.

Önemli olan kopyala ve yapıştır için bir yönetim ödül sisteminin mevcut olmasıdır. Temel neden, insanların kopyala-yapıştır için ödüllendirilmesidir (yani, ücretli veya övülmüş veya terfi ettirilmiş veya uzatılmış).

Kültürü, "özellikleri olabildiğince hızlı bir şekilde serbest bırakmak için bastırılmış" durumundan "uygun, iyi test edilmiş kod tabanı değişikliklerini yaptığınız için ödüllendirilen" e değiştirmeden bunu kıramazsınız.

Yapman gerek

  1. En üste, ödülleri güçlendiren yöneticilerle başlayın. Mevcut uygulamayı ortaya çıkarmalı ve maliyetleri ve riskleri belgelemelisiniz. Maliyetleri ve riskleri azaltan bir alternatif önermelisiniz.

  2. Bu kuruluştaki görev sürenizin geri kalanı için maliyet ve riski acımasızca belgelemek ve ortaya koymak zorundasınız. Amansız. Gerçek tabanlı. Maliyet ve Risk. Her hafta daha fazla maliyet ve kopyala yapıştır nedeniyle daha fazla risk.

  3. Yöneticilerin, iyi görünmelerini sağlayacak yeni yaklaşımı kredilendirmelerine yardımcı olmanız gerekir ve göz ardı edilirsiniz.

Kopyala ve yapıştır işlemlerini azaltmak çok önemlidir. Ancak bir kurumun kültürünü değiştirmek zordur. Çok fazla gerçek vermelisiniz ve davayı sizinle aynı fikirde olmayan yöneticilere tekrar tekrar vermelisiniz.


1
+ 1 "Yöneticilerin kendilerini iyi göstermelerini sağlayacak yeni yaklaşımı kredilendirmelerine yardımcı olmanız ve yok sayılmanız gerekir." Bunun sık sık gerçek olduğu daha iyi hazırlanmalı :-(
Péter Török

@ Péter Török: Bundan çok fazla insan pes ediyor. Kopyalama / yapıştırma işlemlerinin neden olduğu sorunlara ilişkin gerçekleri toplamıyorlar ya da tekrar tekrar yönetime dava açmıyorlar.
S.Lott

Burada daha derin, teknik olmayan bir sorun olduğunu biliyorum. Ama umurunda kimsenin yakında düzeltebileceği bir sorun. Bu, üzerinde çalışmanız gereken üçüncü taraf bir kitaplıktaki bir hata gibi.
LennyProgrammers

@ Lenny222: Yorumunuz çok mantıklı değil. "Bu kimsenin yakında herhangi bir zamanda düzeltebileceğini umursamayan bir sorun" sorusu net. Bu yorum ne anlama geliyor? Cevapta eksik olan ne? Daha ne gerekiyor?
S.Lott

Bu sürekli bir eğitim süreci olacaktır.
JeffO

5

Şimdi bu çürümeye başlamıştı bir kod tabanı var. Temel olarak diğer modüllerde aynı statik işlevlerle özdeş olan modül başına 10'dan fazla statik işlevim vardı. Her biri davranmış sadece mümkün olduğunca çabuk şeyler yapmanın uğruna yeni enkarnasyona gerektirecek farklı yeter.

Bugün başka bir özellik daha eklemek zorunda kaldım ve daha fazla dayanamadım. Yeni bir kütüphane oluşturdum, 100 + işlevlerini bit bayraklarına göre davranışlarını hafifçe değiştiren 10 yeniden işlevle birleştirdim ve daha sonra bu kütüphanede yapılan herhangi bir değişikliğin başka hiçbir şeyi bozmadığından emin olmak için bir dizi test yazdım.

Toplam harcanan süre: 4 saat. Gerekirse 20 saatlik bir maratona gitmeye hazırdım ve ne kadar çabuk kontrol altına aldığımı görünce şaşırdım. Bonus olarak, daha sonra bir grup başlık bağımlılığı sorununu düzeltmek daha kolaydı. Ayrıca, özel mülklerimizin çoğu artık bağlantı için statik nesnelerde bulunduğundan, kaynak koduna daha önce sahip olduğumuzdan daha fazla erişen müşterilerimize verebiliriz.

Benim tavsiyem: şimdi yapmadan önce mermiyi ısır ve tekrar et, gerçekten kötü olur . Muhtemelen düşündüğünüz kadar uzun sürmez, ancak her ihtimale karşı kendiniz için yeni bir şube oluşturun.

Ayrıca, yine kapıdan özellikleri almak yapıştırmak / kopyalayabilirsiniz ederken temel sorunu düzeltmek. İşiniz bittiğinde, yapıştırılan öğeleri yırtın ve bunun yerine yeni kitaplığı kullanın.


Meraklı, aynı olanı buldun mu?
JeffO

@Jeff - Evet, birkaç tane. Ancak çoğunlukla desen, çoğaltmanın, kütüphane kodunun biraz farklı bir şey yapmak için (olması gereken) olmasını isteyen birinin bir sonucu olduğunu gösterdi.
Tim Post

5

Şimdiye kadar verilen cevaplara katılıyorum. Malısın:

  • birim testleri oluşturma
  • refactor
  • Eğitim vermek
  • kodlama standartlarına çaba göstermek ve ihlalleri tespit etmek

Ancak diğer taraftan, insanların bunu kopyalayıp yapıştırmasına neyin sebep olduğuna bakmanız gerekir.

  • insanlar kodu çok iyi bir şekilde kullandığından kodu iyi bir şekilde kullanamayabilir
  • insanlar kullanabilecekleri bir kütüphane olduğunu bilmeyebilirler
  • Kütüphane kodu yeterince genel olmayabilir ve kendi sürümünüzü oluşturmak mevcut bir kütüphaneyi kullanmaktan çok daha kolaydır
  • İyi bir sürüm oluşturma (kaynak kontrolü değil) stratejisi olmayabilir ve genel bir kitaplığın değiştirilmesi, diğer birçok uygulamanın da test edilmesine neden olabilir.

Bu yüzden yeniden kullanımı kolaylaştırmak için ihtiyacınız olan kopyala / yapıştır desenini durdurmayı düşünüyorum.

  • kütüphaneleri bulunabilir ve iyi belgelenmiş hale getirme
  • kütüphaneleri her şeyden bağımsız hale getirin
  • iyi bir versiyonlama stratejisi düşünün
  • geriye dönük uyumluluk sağlamak
  • kütüphanelerin kolay genişletilebilirliğini düşünün

Çerçeve Tasarımı Yönergeleri'ni okuyun

Bu yardımcı olur umarım.


3

Güçlü bir "kopya pastası zararlı kabul edilir" tutumu vardır. Bence iyi, ama biraz fazla ileri gidiyor. Üçgenleştirme sürecindeki bir adım olarak iki yöntem veya sınıf arasındaki benzerlik ve farklılıkları keşfetme alıştırması olarak kopya yapıştırma sağlıklıdır. Ancak, tam bir üçgenleme eksikliği - kopyala yapıştırma ile getirilen kopyayı ortadan kaldırmak - gerçekten zararlıdır.

Bu daha nüanslı tutumu kullanmanın yollarını bulabilirseniz, geliştiricilere "bu kötü değil!" Değil, daha ziyade "eksik, yeniden düzenlemeyi tamamlamak için benimle çalışabilir misiniz?"


2

Burada aynı sorunla ilgileniyorum ve benim üstümde: Açıktan kaçınmaya çalışmayın, çok kötü olduğunda sadece refactor.

Şu anda başlangıçta başka bir modülün kopyası olarak çalıştığım modül, şimdi farklı olması gereken her şeyi değiştiriyorum. Bu yapıldıktan ve yeni modül bittiğinde, onu orijinal modülle karşılaştıracağım ve hangi parçaların az çok değişmediğini ve bir kütüphaneye, soyut ebeveyn sınıfına vb. Taşınması gerektiğini öğreneceğim.


2

Sorumlu kim hatalı. Bir kişinin her kod satırını gözden geçirmesi beklenemez, ancak standartları ve zaman çerçevelerini belirler.

Yükleniciler (veya bir projede kısa vadeli olanlar), sadece ilk kez çalıştıkları için telafi edildikleri pozisyona getirilebilirler. En kısa zamanda yapılmasını sağlamak için bazı teşvikler vardır. Kopyalanan kodun hiçbir zaman değiştirilmesi gerekmeyebilir ve bu kod onlar tarafından değiştirilmez.

Onları kendi zamanlarında düzeltmeye zorlayabilirsin. Sonra bunu en baştan yapmaya başlayacaklar, ama sonra işleri halletmek için çok zaman harcayacaklar. AmmoQ'nun sorunlara neden olan şeyleri yeniden düzenleme konusunda doğru fikri olduğunu düşünüyorum.


Katılıyorum. Mesele şu ki, proje yöneticileri iyi tasarlanmış kod için daha fazla ödeme yapmaya teşvik etmiyorlar. Bir hafta harcamak zorunda kalırsam, onlar ücret değil.
LennyProgrammers

@ Lenny222 - kodunu daha iyi hale getirmek için bir projede yerlerinizi seçmek için uğraşabilirsiniz. Başbakan için satış noktası geri gelene kadar olmayacak (genellikle bacaklar arasında kuyruk ile) ve sadece 'endişelenmeyin, bu kısmı daha esnek olacak şekilde inşa ettik' cevabınızı duymak için büyük bir değişiklik olacağını düşündüklerine ihtiyaç duyuyorlar. . Sonunda bir şeyler yapmanın ve müşterinin beklentilerini yönetmenin doğru bir yolu olduğunu öğrenebilirler. Herkes kaliteli yazılım ister, ancak çok azı bunun gerçekten maliyetini bilir.
JeffO

1

Kopyala / yapıştır kodunu ortadan kaldırmanın tek yolu (IMHO) kod incelemeleridir, kodu kontrol etmek için bir kişi (veya tercihen daha fazla) bulundurun ve bir kopyala / yapıştır eyleminden gibi görünen kodu bulduklarında programcıyı yeniden düzenleyin.


1

Önerildiği gibi bu esas olarak organizasyonda bir sorundur. İnsanları eğiterek başlayın (konumunuzun üstündeki doğrudan yönetim katmanını unutmayın). Treninize bir veya iki kişi girmeye ve virüsün yayılmasına izin vermeye çok yardımcı olur. Çoğunluk bunun iyi bir fikir olduğunu düşündüğünde, tarifini alın ve bu şekilde kalmasını garanti etmek için incelemeleri tanıtmaya çalışın. Bu çok yavaş ve sıkıcı bir süreçtir, ancak hızlı bir şekilde değişemez. İlk başta ekstra zamana mal olacak, bu yüzden yönetimin uzun vadeli hedefi bilmesi ve desteklemesi önemlidir.

@Anders K. Yorumlar, uygulamayı yerinde tutmak için iyi bir araçtır. İnsanları kod yazmaya zorlarken, buna inanmıyorlar çok fazla sürtünme yaratıyor. Mümkün olan en kısa sürede eski alışkanlıklarına geri dönecekler. İvme kazanmak için eğitime başlamanız gerektiğine inanıyorum.

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.