[:tr]Haftalık C++ 3 – if/switch ilklendirme ifadeleri[:en]Weekly C++ 3 – if/switch init-statements[:]

[:tr]Bu yazımda, C++ 17 ile gelen ve değişkenlerin tanımlı olduğu kapsamları kısıtlamamıza yardımcı olacak yeni bir kapsam mekanizmasından bahsedeceğim. Bildiğiniz gibi, tanımladığınız değişkenlerin kapsamlarını olabildiğince küçük olacak (yani geçerli olduğu kapsamı azaltmak) şekilde tanımlamak tavsiye edilen bir yöntemdir.

Değişkenleri olabildiğince küçük bir kapsam içerisinde ve ilk kullanıma yakın tanımlayın.

Peki neden? Her ne kadar çoğu derleyici siz değişkeni tanımlayıp kullanmadığınızda sizi uyarsa da, her bir değişken tanımladığı kapsamı kirletmekte ve daha iç kapsamlardaki aynı isimli değişkenleri örtebilir (buna ayrıca gölgeleme veya isim gizleme de denir). Bundan daha da önemlisi bu tarz tanımlamalar kodun karmaşıklığını arttırmakta ve onu daha az okunur, idamesi zor bir hale getirebilir. Aşağıda bu durumu gösteren çok basit bir örneği görebilirsiniz:

Yukarıdaki kullanım yerine, aşağıdaki kod kullanılmalıdır.

C++ 17 ile birlikte bu tarz kapsam kısıtlamayı kolaylaştıran “ilklendirmeli if/switch ifadeleri” mekanizması dile eklendi. Aşağıdaki standarda ilişkin kaynakta bu mekanizmaya ilişkin detayları bulabilirsiniz.

For ifadelerine benzer şekilde, if/switch parantezleri içerisinde sadece bu ifadelere ilişkin bloklar (if/else, switch/case) içerisinde geçerli olacak ilklendirmeleri tanımlayabiliyorsunuz. Aşağıda geleneksel ve yeni yaklaşımı görebilirsiniz:

Bu mekanizmaya ilişkin başka bir örnek kullanıma bakalım hele:

Bu mekanizmanın bir diğer yaygın kullanımı konteynerler ile kullanılan iteratörler ile oluyor:

Aşağıda da normalde çok çirkinleşebilecek bir kodun nasıl sade bir hale gelebileceğini göreceksiniz:

Bu mekanizma ayrıca kritik alanlarda kilitleme için de kullanılabilir:

Son olarak, özellikle çıktı parametreleri içeren API’lere için de bu mekanizma aşağıdaki gibi kullanılabilir:

Bu mekanizmaya ilişkin bir diğer kullanım daha var ama onu da inşallah yeni bir C++ 17 özelliği olan “structured binding” ‘i aktaracağım haftalık C++ yazıma saklıyorum.

O vakte kadar, kendinize iyi bakın!

Kaynaklar

[:en]In this post, we are going to explore a new scoping mechanism which let us to limit scope of a variable further. As you may now, it is always a good practice to reduce the scope of a variable which usually stated as follow so that it is only visible in the intended scope:

Define variables in the smallest scope and as close to the first use as possible.

So why do we do that? Although most modern compilers will warn you about this but you may declare a variable but never use that variable which clutter name space and may hidden other variables (which is also called name hiding or shadowing). This may then increase code complexity and make it less readable and hard to maintain. A very simple and obvious example is provided below:

Instead of above usage, following code should be used.

Well, a new mechanism is provided with C++ 17 that will help you to limit the scope of variables which are if and switch with initializers. You can find the corresponding standard page in references section.
Similar to for statements, now you can define initialization statements in if/switch paranthesises that will only applicable to if/else and switch/case blocks, but not outside. Previous usage of if/switch statements are as follow:

Below code sample illustrates an example usage of this:

Another common usage is for container iterators such as below:

Below code sample also illustrates how can this make your code ugly 🙁

This can also be used to limit the scopes of critical sections such as below:

Finally, it can also be used for APIs that return output parameters as follow:

There is also another usage but I left it for next week where I am planning to cover another feature of C++ 17, structured binding.

Take care of yourselves!

References

[:]