Kod blokları oluşturmak kötü bir uygulama mı?


12

C ++ 'da, aşağıdaki gibi bazı fonksiyonların içinde kod blokları oluşturmak kötü bir uygulamadır:

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

Bunu yapmanın amacı, aynı tip prosedür için aynı "test" değişken ismini birden çok kez kullanmak olacaktır. Gerçekte benim projemde, birden çok değişkenim var ve birden fazla test yapıyorum. Testlerin ne kadar benzer olduğunu göz önünde bulundurarak, testlerin her biri için farklı adlarla yeni değişkenler oluşturmaya devam etmek istemiyorum.

Her testten sonra değişkenlerin kapsam dışı kalması için kod blokları eklemek kötü bir uygulamadır ve isimlerini tekrar kullanabilir miyim? Yoksa başka bir çözüm mü aramalıyım? Tüm testlerim için aynı değişken setini kullanmayı düşündüğümü (ve her test bittikten sonra hepsini 0'a ayarladığımı) not etmeliyim, ancak bu kötü bir uygulama olabilir.


19
Bu kodu yeniden ele geçirirsem, bu testlerin her birini ayrı yöntemlere ayırmanızı söylerdim ... Sonuç olarak, bunları ayrı ayrı kapsamak için kod bloklarını kullanmanız gerekmezdi.
Maybe_Factor

1
@Maybe_Factor - Kabul ediyorum. Ayrı yöntemlerin avantajı, daha okunabilir bir kod sağlayarak her bloğa ad verebilmenizdir.
mouviciel

@mouviciel Sadece daha okunabilir kod değil, daha okunabilir test raporları!
Maybe_Factor

@Maybe_Factor Katılıyorum. Bir şeyleri ayrı işlevlere taşımak, onları çok az yeniden kullanılabilir işlevsellik parçası gibi göstermenin olumsuz etkisine sahiptir. Bir fonksiyonun tüm mantığını tek bir yerde tutmak iyidir.
Miles Rout

1
@MilesRout Bu tek bir mantıksal işlev değildir, hepsi tek bir test işlevine sıkışmış bir işlev için birden çok birim sınamasıdır. Kod blokları ve normal koddaki fonksiyonlar tamamen başka bir tartışmadır.
Maybe_Factor

Yanıtlar:


22

Bazı kaynakları kapsamak için bloklar kullanıyorsanız, bloklar son derece makuldür. Dosyalar, ağ bağlantıları, bellek tahsisleri, veritabanı işlemleri, her neyse. Bu durumlarda, blok aslında kodun mantıksal yapısının bir parçasıdır: bir kaynak oluşturursunuz, bir süre vardır ve daha sonra belirlenen bir zamanda gider.

Ama eğer yaptığınız tek şey bir isim yazmaksa , o zaman kötü uygulama olduklarını söyleyebilirim. Genel olarak konuşmak gerekirse; özel durumlar uygulanabilir.

Örneğin, bu işlev bazı kod üretme sistemi, test çerçevesi veya benzerleri tarafından üretildiyse, ad kapsamı için bloklar makul bir şeydir. Ama bir insan için değil, bir makine için yazılmış koddan bahsediyorsunuz.

Bir insan aynı işlev içinde isimleri yeniden kullanmaları gereken bir kod yazıyorsa, bu blokların muhtemelen ayrı işlevler olması gerektiğini söyleyebilirim. Özellikle bu isimler bu bloklar içinde farklı türlerde ve / veya anlamlarla kullanılıyorsa


10

Böyle bloklar oluşturmak kötü bir uygulama değildir. Kapsamlar böyle çalışır.

Bu genellikle RAII (Kaynak Edinimi Başlatmadır) kullanılırken yapılır ve yıkıcıların ne zaman çağrıldığını kontrol etmek istersiniz.

Uzun sürerse, bu kodu kendi işlevine taşımayı düşünürüm.

Bence sadece değişken isimlerini geri dönüştürmek için kullanmak iyi bir fikir değil. Ancak hafızası az olan durumlarda faydalı olduğunu görebiliyorum


Yerel değişken adlarının yeniden kullanılmasının bellek kullanımı üzerinde bir etkisi yoktur.
kevin cline

1
Bir akıllı optimize edicinin 2 değişken için 1 bellek konumu kullanabileceğini düşünmüyor musunuz?
Robert Andrzejuk

3
Evet. Ama aynı kapsamdalarsa, yıkıcıları yoksa da bunu yapabilir.
Sebastian Redl
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.