Kod tekrarı ve çoklu sorumlu yöntem


11

Tek Sorumluluk İlkesini (SRP) izlemeye ve Kod Tekrarlarını atlamaya çalışıyorum. Bununla birlikte, genellikle kod tekrarlamalarının, en azından anlamlı bir yöntem olarak ayıklanmaya dirençli invokasyon blok bloklarından başka bir şey olmayan yerler vardır:

DoAction1();
DoAction2();

if (value)
    DoAction3();

DoAction4();

Bu kodu bir yönteme çıkarmanın en iyi yolu nedir ve nasıl adlandırılır?


1
Neden farklı anlamlı bir yönteme tabi tutulmaya karşı dirençlidirler?
Chandranshu

Tüm eylemler ilgisiz bir şey yapar. Yazmam gerekecekti void MethodThatDoAction1ThenAction2AndAction3IfValueAndThenAction4(). Doğrusu daha anlam görecekti: CodeBlock1().
yBee

4
O zaman bu sadece çıkarılan yöntemi doğru bir şekilde adlandırmak meselesi, değil mi? Korkarım evrensel bir çözüm yoktur ve bunu duruma göre yapmanız gerekir. Aynı kod parçasını 1'den fazla yerde tekrarlıyorsanız, eylemleriniz için bir anlam olması gerekir ve bu anlamı bulmak ve bir isim vermek için sert görünmeniz (tartışılabilir) gerekir.
Chandranshu

1
Herhangi bir teselli varsa, uzun sınıf isimleri için Bahar kazanan AbstractInterruptibleBatchPreparedStatementSetteryönteminizden biraz daha küçüktür.
Chandranshu

1
@Chandranshu Yorumlarınızın bu soruya cevap olarak iyi çalışacağına inanıyorum.
Simon Forsberg

Yanıtlar:


13

Bence bu sadece çıkarılan yöntemi doğru bir şekilde adlandırmak meselesidir. Korkarım evrensel bir çözüm yoktur ve bunu duruma göre yapmanız gerekir. Aynı kod parçasını 1'den fazla yerde tekrarlıyorsanız, eylemleriniz için bir anlam olması gerekir ve bu anlamı bulmak ve bir isim vermek için sert görünmeniz (tartışılabilir) gerekir.

Herhangi bir teselli varsa, uzun sınıf isimleri için Bahar kazanan AbstractInterruptibleBatchPreparedStatementSetter49 karakter anlamına gelir.


11

Aslında sen muzdarip bir programcı tarafından en zor üst görev - şeyler Adlandırma . Böyle amatör bir cevap için özür dilerim ama dayanamadım. Bunu bulabilirsiniz birçok kişi bu muzdarip sen bile internette, denemenin bu tür bulabilirsiniz .

Şimdi tekrarlayan kod hep birlikte bir çalışma sonuçlanıyor ve bu yöntemler diğer yöntemler tarafından kullanılmıyorsa o zaman onlar sadece Helpers yöntemi ve sonra elde edilen yöntem olarak adlandırılabilir doXXXveya makeXXX... Bence noktası olsun düşünüyorum.

As Chandranshu dedi "sen [...] Bu anlam ve buna bir ad vermek yinelenen ise." noktaya ve uygun.

resim açıklamasını buraya girin

Pic nezaket: CodeChef Facebook Sayfa Fotoğraf


2

Kod Tekrarlama ilkesini çok ileriye götürdüğünüzü düşünüyorum. Kod Tekrarlamadan kaçınma noktasını düşünün. Mesele, mantıkta bir değişiklik olduğunda kontrol edilmesi gereken kod miktarını azaltmak ve açıkça benzer şekilde amaçlanmış blokları çarpanlarına ayırarak anlamayı arttırmaktır.

Tekrardan kaçınmak için çarpanlara ayırmanın düşüşleri, paylaşılan bloklardan birinin değişmesi gerektiğinde, şimdi daha karmaşık bir mirasa veya standart ve standart dışı uygulama arasında bir geçişe ihtiyaç duymanızdır.

Bu nedenle , bu bloklardan biri için bile , bu ortaklığın çarpanlarına ayrılarak elde edilen anlama faydalarına karşı mantık değiştirme olasılığını dikkatlice tartın . Bir uygulama diğerlerinden ayrılırsa, kodu tekrarlayarak çok daha iyi olabilirsiniz.

Bu tekrarlanan kodu korurken, daha karmaşık hale geldikçe ve sorun alanınız daha tanımlandıkça, tekrarlanan, şimdi daha karmaşık ancak aynı zamanda daha tanımlanmış bölümleri hesaba katmanın daha uygun olduğunu görebilirsiniz .

Tekrarlayan gibi görünen bir şeyin çarpanlara ayırmaya değer olup olmadığını görene kadar genellikle metin düzenleyiciyi aynı tutmaya çalışırım. Sadece tekrarı koruyorum, ancak daha sonra eşleşmesini metinsel olarak kolay tutarak o bloğun geleceğine bakıyorum.

Çoğu zaman, aynılık ve olası faktoring, gerçek, kaprisli, iş kuralları ve oldukça bağımlı, genellikle keyfi mantık gibi dağılmaya başlar; birkaç yaygın veritabanı uygulamasının tuhaflıklarıyla uğraşmak gibi (ANSI_NULLS veya bazıları akla gelen) eklenir; saf mantık gibi görünen şeyleri bükülmüş bir karmaşaya zorlamak , endüstrinin durumunun karmaşasıyla karşı karşıya kaldığında makul, savunulabilir karar mantığı sağlamaya çalışmak .

Bana öyle geliyor ki, insanlar faktoring yapmaya çalıştığınız şeyi hesaba katmaya çalışırsa, Do1Then2If2False Do1IfTrueDo2 gibi değersiz yapılardan oluşan bir kütüphanemiz olacaktı.

Daha karmaşık ve daha açık bir şekilde, bloğun onu çarpanlara ayırma emriyle değişmeyeceği daha açık ve net olmalıdır.

Bu bir yazılım . Geri dönebilir ve şu anda aynı olan birkaç bloğu düzenleyebilirsiniz. 5 dakika sürecek. Ve sadece boşalarak ve iyi, RSI karşıtı bir klavyeye sahip olduğunuzdan emin olarak, boşa harcanan faktoringi ve daha sonra saatlerce boşa harcanan miras ve anahtarlama geliştirmesini kaydedebilirsiniz.


Kod tekrarı özünü ayıklayan bölümü seviyorum: mantık bir değişiklik olduğunda kontrol edilmesi gereken kod miktarını azaltmak için
yBee

1

Tek Sorumluluk İlkesini gerçekten izliyorsanız, bu kod bloğunun belirli bir amacı olmalıdır, değil mi? Aksi takdirde bu yöntemler ayrı sınıflarda olacaktır.

Peki, bu kod bloğunun amacı nedir? Bunu belirleyin ve bir isim bulabilmelisiniz.

Bu şeyin adını hala anlayamıyorsanız, belki de bu yöntemler aslında bir araya gelmez. Yani bu sınıf / kod bloğunun birden fazla sorumluluğu vardır. Bu durumda, görevleri bölmek için yeniden düzenleme yapmak, amacı daha iyi ortaya koyan bir isim ortaya çıkarabilir.


1

Sizinkine benzer bir durum yaşadım:

Temsil ettiği nesnenin işlevselliğini tanımlayan bir sınıf var:

class Functionality
{
protected:
void functionA();
void functionB();
...
void functionZ();
}

Ardından, nesnenin gerçekleştirdiği yüksek düzey işlemler için iş akışlarını tanımlayan bir sınıf vardır:

class Workflows: private Functionality
{
    void WorkflowA()
    {
        functionA();

        if (m_bValue) {
            functionB();
        }

        functionC();
    }
    ...
    void WorkflowB();
}

Benzer bir durumdaysanız, sınıflarınızın neyi temsil ettiğini (bu durumda işlevsellik / iş akışları) belirleyin ve yöntemleri buna göre adlandırın.

Feragatname: Bu örnekte kullanılan sınıf isimleri büyük ölçüde yanlıştır, ancak yöntem isimleri ipucu verir. Takdir yetkisi önerilir.

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.