C için Kodlama Referans Kılavuzu

Bu yazımda sizler ile internet üzerinde C programlama için kullanılan güncel kodlama kılavuzlarına bakarken denk geldiğim ve hoşuma giden bir referans dokümanı paylaşmak istiyorum. C++ için de kullanılabilecek kodlama standartları ya da kılavuzlarından sadece kısaca bahsedeceğim ama detaylarına girmeyeceğim. Onun ile ilgili ayrı bir yazı yazmayı planlıyorum.

Giriş

Profesyonel hayatımda uzun süredir C++ programlama dilini kullanarak yazılım geliştiriyorum. Özellikle uzun zamandır yer aldığım, emniyet kritik yazılımların geliştirilmesinde, proje başında oluşturduğumuz kodlama standardı dokümanlarımız oldu ve yazılımlarımızı bu standartlara bağlı kalarak geliştirdik. Bir süre önce de, C programlama dili kullanarak bir yazılım geliştirmeye başladım. Daha önceleri, JSF AV, MISRA C ve benzeri bir takım kılavuları kullanıyorduk, açıkçası güncel C kodlama standartlarını da merak ederek kısa bir araştırma yaptım. Birazdan sizler ile de paylaşacağım doküman ile karşılaştım. Doküman ile ilgili görüşlerimi paylaşmadan önce, kodlama standartları ile ilgili bir kaç düşüncemi kısaca, sizler ile paylaşıp, daha sonra dokümana geri döneceğiz.

Bana kalırsa, kod genelinde bir bütünlüğün sağlanması açısından bu tarz standart ve kılavuz dokümanların faydalı ve gerekli olduğunu düşünüyorum. Bu hem daha güvenli, temiz ve anlaşılır bir kod elde etmenin yanında, takımdaki herkesin aynı dili konuşmasına da (bu durumda tabi yazma da oluyor 🙂 ) faydası olduğunu düşünüyorum. Tabi pratik olmayan, sadece yapmış olmak için konulacak kurallardan olabildiğince kaçınmak, kılavuz içerisine konulacak kural kümesini de olabildiğince sade tutmakta fayda olduğuna inanıyorum.

Kodlama standartlarına ilişkin internet üzerinde bir çok yazı bulabilirsiniz. Bu anlamda benim  hoşuma giden bir yazıya “Joel on Software” sayfasında rastladım (bu arada vaktiniz olursa bu sayfayı da okumanız tavsiye ederim, kodlama standartları, “hungarian notation” ve benzeri konulara ilişkin güzel tespitleri var, ayrıca genel olarak diğer yazıları da oldukça güzel ve faydalı). Şöyle der kendisi:

Olabildiğince, hatalı kodu, hatalı gösterecek kodlama yaklaşımlarına/kurallarına yönelin.

Tabi, bütün kurallar tamamen bu şekilde olacaka diye bir kaide yok, arada isimlendirme ve benzeri, mekanik kuralları içeren kısımlar da olacak. Ama bunları yazarken bile, bizi hatalı kodları yazmaktan alıkoyacak bir motivasyon ile bir kural seti hazırlarsak bu bizim için çok daha faydalı olacaktır.

Bunun ile birlikte özellikle büyük çaplı projelerde ya da sürekli entegrasyon kullanılan durumlarda bu tarz kuralların çeşitli araçlar ile de tetkik edilmesi oldukça önemli. Bu sizi bir çok yükten kurtaracak ve daha çevik hale getirecektir.

Son olarak bence kodlama kılavuzları için en önemli husus, bu kılavuzların bütün ekip ile birlikte hazırlanarak, özümsenmesi ve kabul görmesi. Bir kişi tarafından dikte edilen ve motivasyonu anlaşılmayan kurallar, bir süre sonra yük ve angarya haline gelecek, ekip için motivasyon düşürücü bir hal alacaktır.

Bu noktada mevcut kodlama standartlarına göz atarak, bunlardan faydalanmak, ön almak için bence oldukça önemli. Eğer siz de, bir şekilde C programlama dili kullanarak gömülü yazılım geliştiriyorsanız ve bu tarz bir kılavuz takip etmek ya da en azından daha temiz kod yazmak için bir kaynak merak ediyorsanız, bir sonraki başlıkta değineceğim kılavuz, güzel bir başlangıç noktası olacaktır.

Embedded System Development Coding Reference Guide

https://www.ipa.go.jp/files/000065271.pdf

Bu doküman, Japonya Enformasyon Teknolojisi Geliştirme kuruluşu tarafından hazırlanmış ve tam açılımı “Embedded System Development Coding Reference Guide [C Language Edition]”, kısaca ESCR. Doküman bir kaç revizyon geçirmiş ve bağlantıda vermiş olduğum doküman 3. revizyon. Nelerin değiştiğine ilgili doküman içerisinden göz atabilirsiniz.

Burada kodlama kılavuzundaki maddelerin üzerinden tek tek gitmek yerine, genel yaklaşımından ve hoşuma giden kısımlardan bahsedeceğim.

Öncelikle dökümanın ilk kısmın, ilk bölümünde (1.1) genel olarak kodlama kılavuzlarının faydaları, bu kılavuz için temel alınan diğer kılavuzlar, hedef kullanımlar ve bu kılavuzun kullanımına ilişkin bir takım kurallar mevcut. Bu kılavuzun kullanımına ilişkin detaylı senaryolara, yeni kodlama kuralları oluşturulmasına ve bu kılavuzu, kendi kılavuzlarınızı oluşturmada nasıl kullanabileceğiniz ise 1.3 başlığı altında verilmekte. Bu ilk bölümü okumanızda fayda var, ama zamanınız yok ise bu iki alt bölümden önce, 1.2 kısmını muhakkak okumanızı öneriyorum. Şimdi bu kısma biraz daha yakından bir göz atalım.

Bu kısmın başlığı aslında içeriği ile ilgili bir fikir veriyor: Kalite Karakteristikleri. Yazılım mühendisliği alanında kalite denildiğinde başvurulan bir standart varmış (ben de daha önce denk gelmemiştim) ISO/IEC 25010:2011. Bu standart, yazılım ürününün kalitesini temel olarak 8 karakteristik altında ele alıyor. Bunlar kısaca aşağıdaki gibi. Bunların tanımlarına da bakacağız, o zaman kelimeler daha anlamlı olacaktır:

  1. Dayanıklılık (Reliability)
  2. İdam edilebilirlik (Maintainability)
  3. Taşınabilirlik (Portability)
  4. Verimlilik (Efficiency)
  5. Güvenlik (Security)
  6. İşlevsellik (Functionality)
  7. Kullanılabilirlik (Usability)
  8. Uyumluluk (Compatibility)

ISO/IEC 25010:2011 standardı, yukarıda belirtilen kalemlerden son üçüne, yazılımın erken safhalarında dikkat edilmesi gerektiğini, özellikle tasarım önce adreslenmesi gerektiğini ifade etmektedir. İlk dört madde ise, daha çok yazılımın geliştirilmesi ile ilgilidir. Güvenlik ise, eski standartta, aslında işlevselliğin bir alt kalemi olarak değerlendirilmiş ve ayrıca ele alınmış. Bunun ile ilgili, doküman içerisinde sayfa 16 da detaylı bilgi mevut.

Sonuç olarak, bu doküman yukarıdaki kalemlerden ilk dördünü referans almış ve bunlar ile ilgili kodlama pratiklerine yoğunlaşmış. Birazdan da göreceğimiz üzere, bütün kodlama kurallarını da bu kalemlere göre gruplandırmış.

Şimdi bu dört kalite karakteristiğine daha yakından bakalım. İlgili standart (ISO/IEC 25010:2011) bu dört karkateristiğe ilişkin alt karakteristikler de tanımlamakta, onlara da burada yer vereceğim. Her ne kadar bunlar, bu doküman için, kuralları gruplandırmada kullanılsa da, yazılım geliştirirken, özellikle gömülü yazılım, bunların farkında olmak ve konuşurken aynı kavramlardan bahsediyor olmak adına, bunlar oldukça önemli. Şimdi madde madde bunlara bakalım. Dokümanda, bunların kod kalitesi anlamında da kullanımlarına örnek verilmekte.

  • Dayanıklılık (Reliability)
    • Tanım: Sistem, ürün ya da bileşenin verilen işlevi, belirtilen koşullar ve süre altında ne derece gerçekleştirebildiğini ifade eder.
    • Alt karakteristikler:
      • Olgunluk (Maturitiy)
      • Ulaşılabilirlik (Availability )
      • Hata toleransı (Fault Tolerance)
      • Kurtarılabilirlik (Recoverability)
  • İdame Edilebirlik (Maintainability)
    • Tanım: Ürün ya da sistemin, planlanmış bakım personeli tarafından ne derecede verimli ve efektif bir şekilde güncellenebildiğini ifade eder.
    • Alt karakteristikler:
      • Modülerlik (Modularity)
      • Tekrar Kullanılabilirlik (Reusability)
      • Analiz Edilebilirlik/İncelenebilirlik (Analysability)
      • Güncellenebilirlik (Modfiability)
      • Test Edilebilirlik (Testability)
  • Taşınabilirlik (Portability)
    • Tanım: Bir sistem, ürün ya da bileşenin bir donanım/yazılım ya da operasyonel/kullanım ortamından bir başkasına verimli ve efektif bir şekilde aktarılabilirlik derecesini ifade eder.
    • Alt karakteristikler:
      • Uyumluluk (Adaptability)
      • Kurulabilirlik (Installability)
      • Değiştirilebilirlik (Replaceability)
  • Verimlilik (Efficiency)
    • Tanım: Belirtilen koşullar altında, göreceli kaynak kullanım miktarı.
    • Alt karakteristikler:
      • Zamanlama Davranışı (Time Behaviour)
      • Kaynak Kullanımı (Resource Utilization)
      • Kapasite (Capacity)

Bu kılavuzdaki kurallar da yukarıda verilen başlıklara göre sınıflandırılmış durumda. Ayrıca kılavuzda, özellikle üzerinde durulan iki kavram var: pratik ve kural. Bunları tanımlarına, ilgili kılavuzda verildiği şekilde bakalım:

  • Pratik (Practice): Bir pratik, kaynak kod kalitesini korumak için izlenen yaklaşım ya da belirli bir fikir seti olarak kabul edilebilir. Her bir pratik, bireysel kodlama kuralı kavramını yansıtır. Bu pratikler de ayrıca, taslak ve detaylar olarak ikiye ayrılır.
  • Kural (Rule): Bir ‘kural’, uyulması gereken ve kodlama kılavuzunun bir parçası olan özel bir anlaşma olarak düşünülebilir. İlgili kılavuzda, bu kurallar referans bilgi olarak sunulmakta. Bazen bir ‘kural’, ilgili kurallar grubunu temsil eden ortak bir terim olarak da kullanılıyormuş.

Aşağıdaki figür (dokümandan alındı), yukarıda bahsedilen kalite kavramları ile pratik ve kuralların ilişkisini göstermesi açısından yardımcı olacaktır:

Kalite kavramları ile pratik ve kuralların ilişkisi

Figürden de görüleceği üzere, bir çok pratik ve kural, birden fazla karakteristik grubu içerisine girebilmekte.

Kılavuzun kullanım senaryolarına bakacak olursak:

  • Yeni bir kodlama kılavuzu oluşturmak
  • Mevcut kodlama kılavuzunu iyileştirmek
  • Geliştiriciler için eğtim ve kendini geliştirmek

amacı ile kullanılabileceği ifade edilmiş ve gayet de güzel özetlenmiş 🙂

Bunların yanında, benim hoşuma giden hususlar ise:

  • Öncelikle dokümanın hem genel yapısı hem de görselliği oldukça iyi. Benim gibi görsel insanlar için çok çekici ve kimi geliştiriciler için sıkıcı olarak nitelendirilebilecek bu tarz bir dokümanı oldukça ilgi çekici ve okunabilir hale getirmiş,
  • İkincisi, otomot, kodlama kurallarını vermektense, bunların arkasında yatan ve yazılımlarımızı daha kaliteli hale getirecek karakteristikler ile ilintilendirmesi oldukça başarılı. Bu sayede, bu kılavuzu (ya da bu referans alınarak oluşturulanları) kullanacak geliştiricilerin, hem bu kuralları uygulamayı daha kolay hale getirmesi hem de belirtilen kuralın hangi yazılım kalite karakteristiği ile ilgili olduğunu anlamasına yardımcı olması,
  • Kodlama kurallarına ilişkin açıklamların doyuruculuğu, uyumlu/uyumlu olmayan kod örneklerinin verilmesi, kuralın muhakkak uygulanması ya da projeye göre değerlendirilmesine ilişkin öneri verilmesi ve mevcut C kodlama standartlarına atıfta bulunması ve özel durumların belirtilmesi,
  • Yine ilk madde ile ilgili olacak ama bence çok önemli 🙂 kolay okunabilmesi ve çok sıkıcı olmaması.

Kılavuzdaki pratik ve kuralların nasıl göründüğüne ilişkin bir figürü aşağıya ekliyorum, eminim neden hoşuma gittiğini anlarsınız 🙂

Genel pratik ve kural görünümü

Bu arada kılavuzdaki pratik ve kuralların daha özet bir listesine 161. sayfadan ulaşabilirsiniz. Burada bütün pratikler ve ilgili kurallar, detaylı kısımlarına referansları ile birlikte verilmekte.

Bu kılavuz yanında C programlama dili için kullanılabilecek diğer kılavuzların ve ilgili yazıların bağlantı adreslerini kaynaklar başlığına ekledim. Muhakkak göz atın.

Yine kısa bir yazı yazayım diye çıktım bir yazıyı uzattım sanırım 🙂 Umarım sizleri sıkmamışdır. Ben yazılımperver, bir sonraki yazımda görüşmek dileğiyle.

 

Kaynaklar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.