Fonksiyonun başlangıcında değil, iç bloklara beyanlar koymanın olası dezavantajı nedir?


9

Çalıştığım yerde, değişkenlerin beyanlarının yerleştirilmesi için açık yönergeler var. Buna göre, iç bloklara (örneğin bir döngü gibi) değil, küresel seviyeye ve / veya fonksiyonların başına konması gerekir. Benden daha deneyimli kişiler tarafından belirtildiklerinden eminim, bunun iyi bir nedeni olmalı, ancak bunun ne olabileceğini anlayamıyorum. Daha büyük bir kapsamda beyan edilmesinde herhangi bir derleme zamanı / çalışma zamanı avantajı olup olmadığını bilmek güzel olurdu.

Yanıtlar:


8

İki ana avantaj görüyorum:

  • Değişken adlarının farklı türde yeniden kullanılması önlenir.
  • Daha önce, bir rutinin yeniden düzenlenmesi gerektiği açıktır. En üstteki değişkenler oldukça hızlı bir şekilde büyük bir karmaşa haline gelir ve bu karışıklığın fark edilmesi kolaydır.

Tuzuna değer herhangi bir derleyici, değişkenlerin kapsamını zaten optimize edecektir, bu yüzden sadece bir biçimlendirme endişesi.

İki sentim için, yine de, kapsamın amacını derleyiciye taşımak için değişkenin en içsel beyanını tercih ederim. Bir değişkene yalnızca döngü içinde erişmeyi amaçladıysanız, döngüde değişkeni bildirdiğinizde daha sonra başvuruyu derleme zamanında yakalayabilirsiniz.


3

Şimdiye kadar bulduğum tek avantaj kod basitliğidir. Değişken bildirimleri nerede arayacağınızı biliyorsunuz ve takımdaki herkes aynı kodlama stilini benimsiyor. Bu şeyler kod bakımını kolaylaştırır, ancak daha iyi kod yazmayı daha kolay hale getirdiklerinden emin değilim. Ben sadece kötü kod bazen iyi olarak kod yazmak zor olduğu anlamına gelmez. Bununla birlikte, geliştirme ekibi büyükse veya üyeleri kod standartlarını kullanarak sık sık değişiyorsa faydalıdır.


3

Tutarlılığı koruma kararı gibi geliyor. Ayrıca, komşu kapsamlarda farklı değişkenler için aynı adların kullanılmasını önler ve okunabilirliği artırır. Gus'ın belirttiği gibi, değişkenleri nerede arayacağınızı da bileceksiniz. En dar kapsam prensibinin daha iyi olduğunu düşünüyorum, çünkü üstteki değişken dağınıklığı önler. En dıştaki beyan, bir sınıfın ilk IMO'sunun özel üyelerini ilan etmeye benzer.


3

Her dil, stil ve uygulama tercihinde farklılık gösterebilir. Aşağıdaki ila MTU-AV-kural Stroustrup o tercih kodlama standartları olarak işaret eden,.

AV Kuralı 136
Declarations should be at the smallest feasible scope

Bunun mantığı şu şekilde tanımlanır:

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

C ++ 'daysanız, değişkene ihtiyacınız olduğunda bildirmek tercih edilir.


3

Buna en iyi uygulama diyebilir misiniz? Yeni bir C projesi için yönergeler oluşturduğumda, değişkenlerin kullanıldıkları yere yakın bildirmenin her zaman daha iyi olduğunu belirtirim. İki nedenden ötürü, kodu daha sonra yeniden düzenlemeyi kolaylaştırır (yani bir yöntemi ayıklarken). Ayrıca derleyicinin daha iyi optimizasyon yapmasına yardımcı olur.

Bu görüşle yalnız değilim. Aynı sorunu ele alan bir soru: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -them Buradaki cevap onları nerede kullandığınızı belirtmektir. Aynı uygulama Robert C. Martin tarafından 'Temiz Kod' kitabında da açıklanmaktadır.

Ancak, daha eski bir C standardı (C-89) kullanıyorsanız, işlevin üstünde yerel değişkenleri tanımlamanız gerekir. Öyleyse, belki de kılavuz C-89'un kullanıldığı zamandan bir kalıntıdır? Yönergeleri yazan kişiye kuralın neden hala orada olduğunu sormak muhtemelen daha iyidir.


2

Bildirim, çok nadiren (eğer varsa) egzersiz yapılan ancak çok fazla belleğe ihtiyaç duyan bir if cümlesi içerisindeyse, bellek ayak iziniz, işlevin başında her şeyi ayırmanıza göre daha küçüktür (çoğu zaman).

Eğer bir döngü içerisindeyse, belleği tekrar tekrar tahsis etmeniz gerekir, bu performans açısından pahalı olabilir.

İşleri her iki şekilde yapmak için nedenler var.


1

1989'daki eski C standardı sadece bir bloğun başlangıcında değişken bildirimlere izin verir.

Yalnızca C99 bildirimlerine her yerde izin verildiğinden. Belki yeriniz henüz C99'a geçmedi.


C99 kullanıyoruz - ama daha da önemlisi, fonksiyonun başlangıcından ziyade en içteki blokta bildirmenin ne anlama geldiğini araştırıyordum. Belki de yeterince net
değildim

1

Bu kararı verenlerin, beyanları en üste koyan bir norm kullandıkları ve kullanıldığı yere daha yakın beyan etme tercihine geçmemeyi seçtikleri anlaşılıyor.

Bu tutarlılık seviyesinin ne kadar yararlı olduğundan emin değilim. Bazı IDE'ler işleri bulmayı diğerlerinden daha kolay hale getirir. Global değişkenler için bu mantıklıdır, ancak işleviniz çok uzunsa değişken bildirimlerini bulmayı zorlaştırırsanız, daha büyük sorunlarınız olur.

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.