Kod Kalite Ölçümleri ve Sık Kullanılan Metrikler

Bütün programcılar yazdıkları kodun iyi olmasını ister ancak iyinin neye karşılık geldiğini bulmak zordur genelde. Bu noktada günlük hayattan aldığımız birtakım dersler vardır aklımızda kalan.

Örneğin yazdığımız kodda mümkün olduğunca az hata çıksın isteriz, eğer hata çıkarsa da en kısa zamanda bizim veya başka bir programcının hatayı çözebilmesini isteriz, ürünümüzde bir değişiklik yapacaksak bunu ürünümüzün diğer bileşenlerini mümkün olduğunca az etkilemesiniz isteriz.

Bütün bunlar kurumsal dilde, yazdığımız kodun hatasız, esnek, kararlı, anlaşılır, düşük bakım maliyetine sahip olması demektir. Ancak normal şartlarda bunları ancak yazdığımız kod ürün haline gelip piyasaya çıktığında görebiliyoruz.

İşte tam bu noktada yazılım metrikleri devreye giriyor. Geliştirme esnasında sürekli ölçüm ve iteratif düzeltmeler ile yazılım metriklerini geliştirme sürecinin bir parçası haline getirdiğimizde tasarım ve geliştirme sırasında bize ileride daha büyük maliyetler getirecek pek çok hatadan kurtuluyoruz.

Yazılım mühendisliği ve yazılım kalitesinin ölçümü başlığı altında pek çok kod ölçüm metodu bulunuyor. Bunların hepsini uygulamak pratik olarak çok olası değil, öyleyse bizde piyasada en çok kullanılan metrikleri dikkate alarak bir orta yol bulabiliriz.

Koda dayalı ölçümler


1- Code Coverage
     Yazılan testlerin kodun ne kadarını kapsadığını ölçer. Code coverage için %80 gibi bir oran oldukça iyi görünse de aslında az sayıda basit test yazarak dahi bu orana ulaşılabildiği gözlemlendiği için hedeflenen oranın %100 olması önerilir. (Oran hakkında detaylı bilgi için [1] )

2- Cohesion
    Bu ölçüm sınıfın sorumlu olduğu işlerin kendi içindeki uyumluluğunu ölçer. Her sınıfın tek bir sorumluluğu olmalıdır. [3] [4]. Uyumluluk LCOM (Lack of Cohesion in Methods) adı verilen ölçüt ile bulunur. Değişik türleri bulunan LCOM sınıfta yer alan alanlara metodların ortak erişim sayısını temel alan bir ölçümdür. LCOM3 için bu değer 0 ile 2 arasında değişir ve 1'in üzerindeyse sınıf bölünmelidir. [5]

3- Coupling
    Bir nesnenin diğeri ile etkileşime girmesine denir. Program içerinde mutlaka etkileşim olacaktır, ancak bu ilişkinin nesnelerin implementasyon detaylarından mümkün olduğunca bağımsız olması istenir. Farklı ilişki türleri üzerinden ölçülebilir. En çok kullanılanlardan birisi CBO'dur.
Coupling Between Objects (CBO): Miras alınan sınıflar hariç, sınıfın çalışmak için ihtiyaç duyduğu sınıf sayısıdır. (kısaca importları say :)) Kütüphanelerde bu sayı yüksek olabilir ancak çalıştırılabilir sınıflarda 6 ile 10 arası makul kabul edilebir. [6][9]

4- Cyclomatic Complexity
    Bir metodun içerisinde yer alan karar noktalarının (if, else vb.) sayısıdır. Kabul edilen eşik değer 10'dur.[6] [7] Bunun yanı sıra Essential Complexty denilen bir metrik daha mevcuttur ancak Cyclomatic Complexity'nin daha etkili bir metrik olduğu belirtilmektedir.  [8]

5-  Cyclomatic Density
     Koddaki karar noktalarının toplam çalıştırılabilir koda oranıdır. 0.14 ile 0.42 arasındaki değerler için kodun basit ve anlaşılabilir olduğu kabul edilir.[6]

6- Response For Class (RFC)
    Bir sınıfta yazılan ve çağırılan toplam metotların sayısıdır. Bu değer yükseldikçe kodun bakımı zorlaşır. Önerilen eşik değer 55 dir. [9]

7- Weighted Methods for Class (WMC)
    Bir sınıfta yazılan toplam metot sayısıdır. Eşik değeri olarak 6 ile 33 arasında değişik rakamlar önerilmektedir. Ancak Cohesion değeri WMC'ye kıyasla daha önemlidir. [6] [9]

8-  Class Hierarchy Level veya Depth of Inheritance Tree (DIT)
     Miras ilişkisinde sınıfın üzerinde kaç tane atası olduğunu gösterir. 6'nın üzerinde ise test edilebilirliği çok düşük olduğunu, 2 nin altında ise OO ilkerinin fazla kullanılmadığına işaret eder. Uygulamanın genelinde 2 ve 3 düzeyinde olması hedeflenmelidir. [6]

9-  Number of Methods in Class (NOM)
     İdeal değerler 6 ile 20 arasında değişse de 40'ın üzerinde sınıf kesinlikle bölünmelidir. [6] Ancak tek başına bir gösterge olmaktan çok LCOM ile birlikte değerlendirilmelidir.

10- Specialization Index (SIX)
      Kod karmaşıklığını ve bakım maliyetlerini arttırmasından dolayı overload edilmiş fonksiyon sayısının mümkün olduğunca az olması istenir. Bundan dolayı SIX = (Overload Edilmiş Metot Sayısı * DIT) / NOM şeklinde hesaplanır. 1.2 (veya %120)'ye kadar normal kabul edilir.

* Bunların dışındaki ölçülerden metot başına düşen satır sayısının 7-9 arasında olması tavsiye edilse de Cyclomatic Complexty'nin bundan daha önemli olduğu belirtilmektedir. ([2])

Dizayna dayalı ölçümler [11]

1- Afferent Couplings (Ca)
İncelenen paketin dışında yer aldığı halde söz konusu pakete bağımlı paketlerin sayısıdır. Paketin değişmesi halinde etkilenecek paket sayısını gösterir. Bunu paketin sorumluluğun ölçüsü olarak da düşünebiliriz.

2- Efferent Couplings (Ce)
İncelenen paketin kendi dışında kaç tane pakete bağımlı olduğunu gösterir. Paketin yeniden kullanılabilirliğinin ölçüsüdür.

3- Abstractness (A)
İncelenen pakette yer alan soyut sınıfların ve arayüzlerin sayısının paketteki toplam sınıf sayısına oranıdır. 0 ile 1 arasında değişen bu oran 1'e yaklaştıkça paketin esnekliği artar.

4- Instability (I)
I = Ce / (Ce + Ca) şeklinde hesaplanır. 0 ile 1 arasında değişen bu oran 1'e yaklaştıkça paketin kararlılığı azalır. (Yani paketin değişimi sistemdeki başka pek çok paket üzerinde değişiklik yapmayı gerektirir.)

Devam etmeden küçük bir not girelim araya. Karalılık genelde iyi yönde yorumlansa da bir paketin tamamen kararlı olması demek paketin değiştirilebilirliğinin de minimum düzeyde olması anlamına gelir. Bu durumda hangi paketlerin esnek hangi paketlerin daha az esnek ama kararlı yapıda olmasını istediğimizi sorgulamalıyız. Bu konuda cevabı bize "Open/Closed Principle" veriyor. Buna göre yazılımı oluşturan birimler geliştirilmeye açık ancak değiştirilmeye kapalı olmalıdır. Bu noktada hangi tür sınıflar geliştirilmeye açık diye bakarsak soyut sınıfları ve arayüzleri görürüz.

Sonuca bakarsak; Abstractness = 1 ve Instability = 0 olduğu durumda hem kararlı hem de değiştirilebilir paketleri buluruz. Aynı biçimde Abstractness = 0 ve Instability = 1 olduğu durumda ise kararsız ancak değişime kapalı (ve böylece başka paketlerin değişimini gerektirmeyecek) durumdaki paketleri buluruz.

Ancak incelediğimiz paketler her zaman bu iki ideal durumdan birinde olmazlar. Bu durumda bu iki değerin dengede olması yani ;(A,I) = (1,0) dan (0,1) e gittikçe aynı miktarda değişmesi tasarımımız için optimal çözüm olarak görülebilir. Bunu grafiksel olarak ifade edersek;


Main Sequence denilen bu çizgi üzerinde yer alan bütün noktaları ideal noktalar kabul ettiğimize göre bunların dışında elde ettiğimiz değerleri bu çizgiye olan uzaklıklarına göre değerlendirebiliriz. Tasarım veya yeniden yapılandırma sırasındaki amacımız paketlerimizin bu çizgi üzerinde ve çizgiye en yakın durumda olmasıdır.

5- Distance from the Main Sequence (D)
D = |A+I-1| ile hesaplanır ve 0 ile 1 arasında değişir. 0 olması analiz edilen pakete ait değerin Main Sequence çizgisinin üzerinde olması demektir.

Bunların yanı sıra kod tekrar sayısı ile dizayn ve kod izlenebilirliği de dikkate alınması gereken unsurlardır. Kod tekrarı için bütün proje içerisinde kod tekrarı yapılan bölümler tesbit edilerek uygun biçimde (ortak sınıflar, soyut sınıflar, arayüzler) yeniden tasarlanmalıdır. Dizayn ve Kod izlenebilirliği ise (Tasarım belgelerinde yer alan birimlerin, uygulamadaki birimlere (sınıf,modül vb.) oranı) de yazılımın kalitesini belirleyenbir unsur olarak görülebilir.

[1] http://codebetter.com/blogs/patricksmacchia/archive/2009/06/07/high-test-coverage-ratio-is-a-good-thing-anyway.aspx

[2] http://stackoverflow.com/questions/312642/how-many-classes-per-package-methods-per-class-lines-per-method

[3] http://www.cihataltuntas.com/?p=111

[4] http://en.wikipedia.org/wiki/Single_responsibility_principle

[5] http://javaboutique.internet.com/tutorials/coupcoh/

[6] http://www.mccabe.com/pdf/McCabeCodeQualityMetrics-OutsourcedDev.pdf

[7] http://javaboutique.internet.com/tutorials/metrics/

[8] http://www.nasa.gov/centers/ivv/ppt/172536main_Mike_Chapman_The_Relationship_of_Cyclomatic_Complexity_Essential_Complexity_and_Error_Rates.ppt

[9] http://www.issre2009.org/archive/2006_supplemental/student_papers/An_Investigation_of_CK_Metrics_Thresholds.pdf

[10] http://support.objecteering.com/objecteering6.1/help/us/metrics/metrics_in_detail/specialization_index.htm

[11] http://www.objectmentor.com/resources/articles/oodmetrc.pdf

29 Mayıs 2010

Posted In: kalite, ölçüm, yazılım

Telecommunication Sector in Coming Decade?

Next monday, 17 May is the “World Telecommunication Day”. World Telecommunication Day has been celebrated annually on 17 May since 1969, marking the founding of International Telecommunication Union and the signing of the first International Telegraph Convention in 1865. Although ITU Council adopted the theme “Better city, better life with ICTs” to mark World Telecommunication […]

14 Mayıs 2010

Posted In: bilgi teknolojileri, broadband, Gezegen, internet, ITU, mobile, operators, telecom, vendors, voice revenues, World Telecommunication Day

Türkiye’ye İnternette Sahip Çıkmak

Bu konuyu çok uzun süredir düşünüyordum ama yazmamı ateşleyen ard arda gördüğüm birkaç yazı oldu. Bunlardan ilki cennet mekan Vahdettin’in devleti sattığını iddia edenlere çok güzel cevap veren (Vahdettin gizli anlaşma yaptı mı?) yazısı idi. Bu yazıyı sonuna kadar okurken, arada geçen ingiliz işgalini yönlendiren ve takip eden isimlerden Lord George Curzon ve Sir George […]

2 Mayıs 2010

Posted In: linux, Nasıl yaparım?

Apple, Adobe ve Web Standartları

Bildiğiniz gibi Apple’ın iPad’lerde Flash’ı desteklemeyeceğini(izin vermeyecekleri) açıklaması büyük tartışmalar yaratmıştı. Yakın zamanda Apple’ın kurucusu ve CEOsu Steve Jobs, Flash hakkındaki düşüncelerini bir açık mektupla duyurdu. Mektupta genel olarak

  • Tamamen Adobe’un malı olduğu için Açok (Open) Web standartlarına uymadığı
  • Webdeki videoların çoğu Flash arayüzlü olsa da çeşitli uygulamalarla onlara erişilebileceği
  • Flash’ın yeterince güvenli bir sistem olmadığı
  • Güç tüketiminin fazla olduğu
  • Dokunma ile sağlanan etkileşimin verimli kullanılamaması
  • Flash ile uygulama geliştirilmesinin geliştiricileri kısıtlaması, yarı standart uygulamalar üretmesi ve platformun özellikleri etkili kullanamaması

konularına değinmiş. Atrıca Flash’ın HTML5 gibi standartların gelişmesiyle pek de gerekli olmayan bir teknoloji olacağını düşünüyor.

Apple tarafından bakınca haklı oldukları noktalar olduğunu söylemek gerek. Fakat burada dikkat çekilmesi gereken daha önemli noktalar var. Flash konusunda söylediklerinde haklı olması Steve Job’un tutumunu haklı çıkartmıyor. Özellikle sattığı cihazların kullanımı konusunda kendi kullanıcılarını ne kadar kısıtladığını ve iPhone ve iPadlere uygulama geliştirmek için sadece Mac kullanabildiğimizi, Apple Store dışında yazılım yükleyemediğimizi göz önüne alırsak, Apple’ın özgürlük, açık standartlar gibi kavramlar üzerinden Adobe’u eleştirmesini biraz garip karşıladım.

Apple’ın kullanıcının kullandığı yazılımları ve platformları bu kadar kısıtlaması işin garip bir tarafı. Standart olarak flasın gelmemesi, tavsiye edilmesi fakat yine de bunun kullanıcının tercihine bırakılması çok daha etkili bir çözüm olurdu.

Özetle Adobe’ın belli konularda haksız olması Apple’ı bu konuda haklı yapmıyor bence.

Bu düşüncelerimin üzerine FSF’dan (Free Software Foundation) John Sullivan’ın yaptığı bir açıklama konuyu bence daha net bir biçimde ele alıyor.

Steve Jobs’un açık standartların ve özgür webin önemine dikkat çektikten sonra ortaya koyduğu çözümün saçma olduğunu savunuyor ve insanların Adobe’un tescilli yazılımlarıyle Apple’ın duvarlarla çevrilmiş bahçesi arasında bir seçim yapmaya zorlandığını özgürlüğün ikisiyle de alakasız olduğunu anlatmış.

Hele şükür birisi duygularımıza tercüman olmuş…

2 Mayıs 2010

Posted In: Açık Web Standatları, Adobe, Apple, bilgisayar, felsefe, Flash, Free Software Foundation, fsf, iPad, iPhone, linux, LinuxGezegen, Özgür yazılım, steve jobs, teknik

Kelime hataları

Zemberek içerisinde olmayan ya da hatalı olan kelime köklerini ortaya çıkarmak için gazete haberlerinden derlenmiş oldukça büyük bir derlem (350 milyon kelime civarında) üzerinden basit kelime frekans bilgileri çıkarırdım. Sonuçlar TDK (internet sayfası, güncel sözlük) referans alarak kontrol edildiğinde ortaya çıkan bazı bilgiler:

iki yüz kereden fazla geçen bin beş yüzden fazla kelime TDK genel sözlüğünde yer almıyor.

Yabancı kelimeler (frekans sırasına gore):
euro, ribaunt, rock, stand, online, neo, biyo, gay, kriminal, sendikasyon, provokatif, punk, ultra, tekno, depresif, blog, akredite, siber, manipüle, psikiyatrik, istihbari, gribal, östrojen, konjonktürel, reflü, marker, spam, segment, depresan, tiroid, outlet, bonus, kompakt, botoks, omega, reality, romatizmal, modifiye, pivot, domine, cover, aktivist, proaktif, anksiyete, genital, terörize, oligarşik, libor, enfekte, teatral, popstar, kanola, pandemik, mental, apne, hegemonik, minimalist, kote, modernite, entellektüel, elitist, jazz, kondisyoner, chip, protest, etnisite, senkronize, detoks, network, editoryal, pasifize, stilize, pitbull, reforme, draft, psiko, modunda, konteynır, kardiyovasküler, militer, onore, avangard, influenza, ekber, hamd, digital, retro, tabloid, paparazzi, enstalasyon, pilates, spa, paramiliter, moderatör, fiziken, maksimize, bowling, manik, jammer, marin, embriyonik, finansör, brunch, risotto, volatilite, panelvan, serotonin, psikanalitik, hatchback, residence, manipülatif, playboy, premium, magazinel, fiks, coupe, glisemik, otokratik, koleksiyoner, speküle, lokasyon, hologram, karaoke
Bu kelimelerden bir kısmı tıbbi terimler olduğu için kullanılabilir (östrojen, tiroid gibi). Bir kısmı belki eklenebilir (kanola, hologram, karaoke gibi ).

Bazı yabancı kelimeler ise genel sözlükte yer bulmuş, çoğu durumda sadece türkçe eşleniğine referans verilmiş.

mortgage:tutulu satış, motive, aktivite, sektörel, stoper, hit:liste başı, provoke, medyatik, dokunmatik:dokunmalı, kaotik, rehabilite, promil, single:tekli, chat:sanal sohbet, travmatik, inovasyon:yenileşim, fitness:sağlıklı yaşam, küratör, sistemik, kruvaziyer, gey, eko, kümülatif, heteroseksüel, tork, multimedya, tolere, metafor, panoramik, virtüöz, politize, ötanazi, perküsyon, gurme, charter:dolmuş uçak, reformist, sprinter, idol, kuantum, rating, türbülans:burgaç, kredibilite, feminen:kadınsı, mamografi, stabil, osteoporoz, ritüel, suşi, melamin, guru, krampon, idealize,floresan:Florışıl, sinematografik, ontolojik, realizasyon, opsiyonel, kreatif, peeling:soyum, antiviral, optimal, lümpen, holigan, trekking, radyolojik, metaforik, obsesif, nevrotik, plaza, endoskopik, monşer, mantalite, metroseksüel, semitizm, liposuction, stratejist, regülasyon, formel, alzaymır, dekoder,

Her ne kadar yerleşmiş olsalar da bu kelimelerin büyük kısmı sözlüğe hiç alınmayabilirmiş.
Bir iki türetilmiş yeni kelime tutmuş gibi ama çok az sayıda. 200 kullanıma erişebilen tek kelime tutsat idi.
En yaygın yazım yanlışları birleşik kelimelerle ilgili. Bu konu tartışmalı ama TDK referans alındığında hatalı kullanımlardan sadece bir kısmı:

doğalgaz, işadamı, işyeri, yanısıra, eşzamanlı, herşey, hammadde, varolmak, evsahibi, sevketmek, pekçok, karayolu, havayolu, demiryolu, eşgüdüm, içiçe, elele, terketmek, tersyüz, aslolan, özgüven, farketmek, eşanlamlı, terketmek, sözümona, safkan, uluorta.

Bazı yaygın kelime hataları (sadece küçük bir kısmı):

içerde, dışardan, orda, nerdeyse, suiistimal, nerde, mahçup, ünvan, tamamiyle, aksesuvar, orjinal, müşahade, bazan, kasedi, taksidi, burdan, nesile, yukarda, traş, veliahtı, diyaloga, kampus, tabiki, rüştünü, yanlız, ağıza, şahadet, ağbi, üzerleri, bişey, umrunda, tereddüte, açıkca, üstad, fiziken, esamisi, dersane, antreman, tevbe, hemşeri, cüppe, gönüle, konservatuar, repertuar, döküman, küsür, kolestrol, diyerekten, zaafiyet, takiyye, alıcam, alırkan, aralıka, barışcı, başlıyan...

Alüminyum kelimesini doğru yazana rastlamak oldukça güç. aliminyum, alimünyum, aluminyum şeklinde kullanılmış.

Bazı kelimeler TDK'da yok ama olmasını beklerdim: kaale, istihbari, takdiren, cansiperane, gibi.

Bunlardan baska Zemberek'te olmayan ya da hatalı yazılmış pek çok kelime de ortaya çıktı.



1 Mayıs 2010

Twitter Auto Publish Powered By : XYZScripts.com