Dev tutkal yöntemlerinden nasıl kaçınılır?


21

Şu andaki işimde, eski kodu birkaç kez temizlemekle görevliydim. Genellikle kod bir labirenttir ve arkasındaki veriler daha da karışıktır. Kendimi işleri güzel, temiz, modüler yöntemlerle birleştiriyorum. Her yöntem bir şey yapar ve iyi yapar. O zaman işler güneye gitmeye başlar ...

Her zaman, temiz bir API ile bitirdim ve hepsini bir araya getirmenin gerçek bir yolu yok. Çözüm, sonunda tüm "temiz" yöntemlerimi çağıran çirkin bir "yapıştırıcı" yöntemi (genellikle koşullu ifadelerle dolu) yazmaktı.

Yapıştırma yöntemi genellikle, temizlemeye çalıştığım kod / veri arapsaçılarının kısa versiyonudur. Genelde daha okunur, ancak yine de can sıkıcı.

Bu tür yöntemlerden nasıl kaçınabilirim? Bu karışık verilerin bir belirtisi mi yoksa yanlış yaptığım bir şeyin yansıması mı?


3
API'ler kullanılmak içindir. Eline geçen karışıklıktan, bir API yarattın ve sonra tekrar karıştırdın. Belki de sadece iş gereksinimidir. Ancak, API'nızı kullanarak başka biri gelip başka bir yapıştırıcı işlevi yapabileceği için değer kattınız. El sıkmak gerek yok ...
Aditya MP

1
Burada nesneler mi konuşuyoruz, yoksa sadece her tarafa çarpıyor muyuz?
Erik,

3
Bunun bu sorunun bir kopyası olduğunu sanmıyorum, biraz daha genel konuşuyorum (ve tek bir fonksiyondan daha büyük ölçekte).
cmhobbs

1
erik - Burada nesnelerden ve yöntemlerden bahsediyorum. Birkaç şartlı karışıklık alıp bunları API’lere dönüştürdüm. API çağırma zamanı geldiğinde sorun ortaya çıkar. Buradaki ilk cevap tam olarak aradığım şey olabilir.
cmhobbs

2
Bu nasıl bir kopya olabilir?
MattDavey

Yanıtlar:


12

LedgerSMB’i yeniden düzenleyerek deneyimimizi size sunacağım. İşleri daha erken farklı bir şekilde yapmaya karar verdik ve hala tam olarak tanımladığınız şeyi yapıyoruz, ancak çok fazla tutkal yöntemi olmadan (çok az değil, çok az sayıda tutkal yöntemimiz var).

İki Kod Yazılı Yaşam

LedgerSMB yaklaşık 5 yıl boyunca iki kod tabanıyla hayatta kaldı ve eski kod temeli ortadan kaldırılmadan önce birkaç kez daha olacak. Eski kod temeli, dikkat edilmesi gereken gerçek bir korku. Kötü db tasarımı, Perl IS->some_func(\%$some_object);, spagetti metaforunun bazen neden kullanıldığını tam olarak gösteren kodla birlikte inşa eder (modüller ile arka ve diller arasında kafiyeli veya sebepsiz anlam ifade eden uygulama yolları). Yeni kod temeli, db sorgularını saklı yordamlara taşıyarak, istek işleme için daha temiz bir çerçeveye ve daha pek çok şeye sahip olmaktan kaçınır.

Yapmaya karar verdiğimiz ilk şey, modül modülünü yeniden yansıtmaya çalışmaktı. Bu, belirli bir alandaki tüm işlevleri yeni bir modüle taşımak ve ardından eski kodu yeni modüle bağlamak anlamına gelir. Yeni API temizse, bu önemli bir şey değil. Yeni API işler kıllı olmazsa ve bu yeni API’de biraz daha çalışmak için bir davetiye.

İkincisi, yeni kodun eski kodda mantığa erişmesi gerektiğinde birçok kez bulunmasıdır. Bundan mümkün olduğunca kaçınılmalıdır, çünkü çirkin tutkallama yöntemlerine yol açmaktadır, ancak bunlardan biri her zaman kaçınamaz. Bu durumda, yapıştırma yöntemleri mümkün olan en aza indirilmeli ve kaçınılmalı, ancak gerektiğinde kullanılmalıdır.

Bu işlemi yapmak için , belirli bir alandaki tüm işlevleri yeniden yazmayı taahhüt etmeniz gerekir . Örneğin, tüm müşteri bilgileri izleme kodunu bir kerede yeniden yazabiliyorsanız, bu işlemi eski koddan çağıran kodun çalışması zor değildir ve eski kodun yeni koddan gönderilmesi en aza indirilir.

İkincisi, yerinizde makul soyutlamalar varsa, hangi API seviyesini arayacağınızı ve bunu nasıl temiz tutacağınızı seçebilmeniz gerektiğidir. Ancak, API'nizi çağıran bölümleri de biraz daha temiz olacak şekilde yeniden yazmayı düşünmelisiniz.

İndirgenemez derecede karmaşık olan birçok iş aracı alanı vardır. Tüm karmaşıklıklardan kurtulamazsınız. Ancak, özellikle yapmanız gerekenleri yapan temiz API'lere ve bu API'yi yapıcı olarak kullanan modüllere odaklanarak yönetebilirsiniz. Tutkal ancak çağıran kodun geri kalanının daha hızlı olabileceğini düşündükten sonra son çare olmalıdır.


Sanırım kafasına çiviyi vurmuş olabilirsin. Yapıştırıcının mevcut olmasının nedeni, oluşturduğum arayüzü çağıran koddan kaynaklanıyor olabilir. Bir şeyi kaçırıp kaçmadığımızı görmek için bazı cevaplar için bekleyeceğim, ama bunun çok iyi bir şekilde özetlediğine inanıyorum.
cmhobbs

1
"modüller ile arka ve diller arasında kafiye ya da sebep olmadan çıkan uygulama yolları" - bu bana bazı modern OO uygulamalarını da hatırlatıyor.
user253751

8

Yaptığınız şey, bir emsal öncesi kod temeli karışık bir karmaşa alınmış ve hoş bir modüler emsal öncesi kod tabanı oluşturmuş gibi geliyor.

Her zaman, temiz bir API ile bitirdim ve hepsini bir araya getirmenin gerçek bir yolu yok. Çözüm, sonunda tüm "temiz" yöntemlerimi çağıran çirkin bir "yapıştırıcı" yöntemi (genellikle koşullu ifadelerle dolu) yazmaktı.

Prosedürel kodla (OO olarak gizlenmiş olsa bile), her zaman bir yerde tanımlanmış, genellikle tanımladığınız karmaşık koşullu dallarla dolu bir tür ardışık iş akışına sahip olacaksınız. Bir şeyin yanlış olduğunu düşündüren kodun bu usule uygun olmasından şüpheleniyorum. Bu mutlaka kötü bir şey değildir ve eski kodla çalışırken tamamen kaçınılmaz olabilir


6

Büyük çirkin tutkal yöntemini, orijinal kod tabanını temizlediğiniz gibi temizlemelisiniz. Düzgün modüler yöntemlerle bölün. Muhtemelen bazı görevler yapan bu kod satırları grubunuz bu satırları yöntemlere böler, bazı değişkenleri paylaşırsanız paylaşılan değişkenleri ve yeni yöntemleri bir sınıfa koymayı düşünebilirsiniz.


2
O zaman bir tutkal ağacı almaz mısın?
Pieter B,

3
@PieterB belki de, ancak farklı yöntemlerde farklı görevleriniz olduğunda farklı bağımlılıkları çıkarmak daha kolaydır. Yeni yöntemleri çıkardıktan sonra başka bir refactoring geçişi yapabilirsiniz.
Paling

1

Temel olarak, soyutlama katmanları eklemeye devam edersiniz , kendi başına alınan her katmana bakana kadar . Soyutlama ile ilgili paradoksal olan şey, onu azaltmak için karmaşıklık eklemenizdir, çünkü soyutlanmış kodu okuduğunuzda, yalnızca bir seferde yalnızca bir katmanla ilgilenirsiniz. Her katman kolayca anlaşılabilecek kadar küçükse, kaç katman üzerinde durduğu önemli değildir.

Aynı zamanda soyutlamaları yazmayı zorlaştıran da budur. Bir kalem kadar basit bir şey bile kafanızdaki tüm soyutlama katmanlarını bir kerede tutmaya çalışırsanız zihin bükme olabilir. Anahtar, bir katmanı istediğiniz gibi elde etmektir, yaptığınız gibi, o katmanın altında yatan tüm karmaşıklığı unutun ve aynı şeyi bir sonraki seviyede yapın.


0

Sadece API'nin uygulanmasını düşünerek, ancak API'yi kullanan kod hakkında yeterince düşünmeden - yani konuştuğunuz "yapıştırıcı kodu" gibi API'yi yeniden yapılandırıyormuşsunuz gibi geliyor.

Bu doğruysa, diğer taraftan başlamaya çalışabilirsiniz. Önce çirkin yapıştırıcı kodunuz olma tehdidinde olanları yeniden yazın ve bu işlemde API'niz olacak olan henüz uygulanmayan bir çift arayüz oluşturun. Bu API'nin gerçek uygulaması hakkında henüz fazla düşünmeyin - bunu yapabileceğinize dair bir içgüdüye sahipseniz sorun değil. Ve ancak o zaman bu API'ye uyması için kod labirentini yeniden yazın. Tabii ki bu süreçte API ve yapıştırıcı kodunda bazı değişiklikler olacak, ancak daha iyi bir şekilde uyması gerekir.

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.