<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Kaynak Kodlardaki Kötü Kokuların Otomatik Tespiti için Eclipse Eklenti Önerisi</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Melih Altıntaş</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>ve Ebru Akçapınar Sezer</string-name>
          <email>ebru@hacettepe.edu.tr</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Bilgisayar Mühendisliği Bölümü, Hacettepe Üniversitesi</institution>
          ,
          <addr-line>Ankara</addr-line>
          ,
          <country country="TR">Türkiye</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Kötü koku tespit eklentisi Java</institution>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Yazılım Mühendisliği Müdürlüğü, UGES</institution>
          ,
          <addr-line>Aselsan, Ankara</addr-line>
          ,
          <country country="TR">Türkiye</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Code smells in source codes are code fragments; that do not prevent the functionality of the developed application, but which reduce code quality, make code maintenance and understandability difficult and require refactoring. Those types of smells could be found in a class as a whole or in a specific method of a class. Detecting those code smells by manual reviewing is a process that could increase the probability of</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>unintentional omission in terms of the requirement of time, budget, and
manpower as the project grows. Code smells can be caused by errors in
the design phase as well as by the developer’s preferences in the design to
code conversion phase. In this article, we will introduce an Eclipse plugin
that enables automatic detection of code smells in Java source code and
presents the detected code smells to developers and maintainers. In this
way, the software developers and maintainers can continuously evaluate
the quality of the software with realistic values, recognize and refactor
the modules that could cause a bug. This provides better quality,
easier maintainability and effective testability in software. The developed
plugin is tested on the data sets used in fault estimation, and statistical
correlation between software fault and code smells is presented.
According to results, existence of code smells is unrelated with the software
faults. However, existing faults are statistically related with code smells.</p>
      <p>Code smell detection tool Java Software
1</p>
    </sec>
    <sec id="sec-2">
      <title>Giriş</title>
      <p>Dünyada üretilen ya da geliştirilen hiçbir ürün kusursuz olarak nitelenemez;
çünkü kusursuzluğun tanımı her gelişme ile birlikte yeniden yapılır. Ancak
kusur tanımı yapabilmek daha kolaydır. Bu bağlamda, gerek kaynak kodun kendisi
gerekse kaynak kodu üretirken kullanılan kütüphaneler elle geliştirilmiş
olduğundan kusurların ve hataların oluşumuna açıktır. Bu çalışma ile amaçlanan, kaynak
kodlar için kusur olarak tanımlanmış kötü koku olarak adlandırılan kodlama
biçimlerini tespit etmektir.</p>
      <p>
        Tespiti yapılan kaynak kodlarda yer alan kötü kokular; geliştirilen uygulamanın
doğru çalışmasına engel teşkil etmez, bu nedenle beyaz kutu (white box) ve siyah
kutu (black box) testleri yapılarak tespit edilemezler. Fonksiyonel hatalar
olmasalar da bunlar kodun kalitesi üzerinde çok etkilidir; çünkü kötü kokular kodun
ne zaman hangi bölümünün yeniden düzenlenmesi (refactoring) gerektiğinin
cevabıdır. Eğer iyi yönetilmezlerse kodun okunabilirliğini, yönetimini ve bakımını
zorlaştırırlar. Özellikle büyük projelerde zaman geçtikçe birikerek hataya neden
olabilirler. Bu nedenle kaliteli yazılımda kötü kokular olmamalı ve
süreklileştirilen gözden geçirmeler ile kaynak kod bilinen kötü kokulardan temizlenmelidir.
Bu çalışmada Java diliyle geliştirilmiş projelerdeki kötü kokuların bulunması
amaçlanmış, yazılımcı ve bakım sorumlularına kullanıma hazır bir yardımcı araç
olarak Eclipse platformu üzerinden sunulmuştur. Java programlama dili üzerinde
çalışma yapılmasının nedeni, en yaygın kullanılan programlama dillerinden biri
olmasıdır.[
        <xref ref-type="bibr" rid="ref31">31</xref>
        ] Kötü koku tespitinin geliştirme ortamına entegre bir hizmet
olarak kurgulanmasının nedeni ise kaynak kod kalitesinin anlık değerlendirilebilme
gerekliliğidir. Böylece geliştirme sırasında anlık gözden geçirme ve yeniden
düzenleme yapmak mümkün olacaktır. Java kullanan yazılımcıların %33’lük bir
kısmının geliştirme ortamı olarak Eclipse kullanması bizim eklentimizi Eclipse
üzerinden sunmamızın temel nedenidir.[
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]. Eklentimiz ile birlikte büyük
projelerdeki bakım ve test gibi maliyetli işlemlerin süresini kısaltarak iş gücü, zaman
ve maliyet kazancı yaratmayı hedefliyoruz.
2
      </p>
    </sec>
    <sec id="sec-3">
      <title>Alanyazın Özeti</title>
      <p>
        Kötü koku (code smells) kavramı, ilk olarak Martin Fowler’ın kitabında [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] Kent
Beck tarafından sistem kodunda sorun yaratabilecek belirtiler olarak
tanımlanmıştır. Kitapta 22 farklı kötü koku tanımlanmıştır. Kitap resmî olmayan
tanımlar yapmış, tespit ve düzeltme için otomatik bir yol önermemiştir. Daha sonra
Mäntylä [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] ve Wake [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] bunların sınıflandırılması konusunda çalışmalar
yapmışlardır. Kötü kokular sınıflandırılmış ancak bunların tespiti hâlâ gözle kontrole
bırakılmıştır.
      </p>
      <p>
        Marinescu tespit sırasında çok zaman harcanması, tespitinin tekrarlanamaması
ve ölçeklenememesi nedeniyle kötü kokuların tespiti için IPLASMA aracını
geliştirerek metrik tabanlı bir yaklaşım önermiştir.[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Daha sonra bu
çalışmadaki metrik tabanlı yaklaşım geliştirilerek "Object-Oriented Metrics in Practice"
adıyla kitap hâline getirilmiş ve bu alandaki temel taş olarak yerini almıştır. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]
Kitapta 3 ayrı sınıflama yapılarak toplam 11 adet kötü koku tanımlanmıştır. Bu
çalışmayla birlikte kaynak kod içerisinde yer alan kötü kokuları, otomatik olarak
tespit edebilecek metrik tabanlı kurallar da açık biçimde ortaya çıkmıştır.
Metrik tabanlı kuralların ortaya çıkmasından sonra IPLASMA, JDeodorant, PMD,
StenchBlossom gibi birçok otomatik tespit aracı geliştirilmiştir.
      </p>
      <p>
        IPLASMA [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] Literatürde tanımlanan ve bizim bu çalışmada üstünde
durduğumuz 10 adet kötü kokunun tamamını bulmaktadır, ancak uygulama bağımsız
şekilde ele alınmıştır. Başka bir ifade ile, herhangi bir geliştirme platformu ile
entegrasyonu yoktur ve bu nedenle kod geliştirilirken eş zamanlı olarak kötü
kokuların tespiti mümkün değildir.
      </p>
      <p>
        JDeodorant [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] Java dilinde yazılmış kaynak kod üzerinden toplam 5 çeşit
(Feature Envy, Type Checking, Long Method, God Class, Duplicated Code ) kötü
koku tespiti yapabilen bir Eclipse eklentisidir. Geliştirme ortamına entegrasyonu
olması açısından başarılı bir çalışma olsa bile bulduğu kötü koku sayısının az
olması dezavantajıdır.
      </p>
      <p>
        StenchBlossom [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] Java dilinde yazılmış kaynak kod üzerinden 8 adet (Data
Clumps, Feature Envy, InstanceOf, Long Method, Large Class, Message Chain,
Switch Statement, Typecast ) kötü koku tespiti yapabilen bir Eclipse eklentisidir.
Geliştirme ortamına entegrasyonu olması açısından başarılı bir çalışma olsa bile
bulduğu kötü koku sayısının az olması dezavantajıdır.
      </p>
      <p>
        PMD [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] Java dilinde yazılmış kaynak kod üzerinden statik analiz yaparak
birçok olası hata bulmaktadır. Birçok geliştirme ortamına entegrasyonu vardır.
Ancak kötü koku tespitine çok fazla yer vermemiştir, Large Class, Long Method,
Long Parameter List olmak üzere 3 adet kötü koku tespit etmektedir.
Bizim çalışmamız, aynı amaç doğrultusunda, kaynak kod içerisinde yer alan kötü
kokuların tespiti için geliştirilmiştir. Ancak geliştirdiğimiz eklenti IPLASMA
Kaynak Kod
İçerisinde
Bulunan Kötü
      </p>
      <p>Kokular</p>
      <p>Kullanıcıya Sunar</p>
      <p>Tespit Eder</p>
      <p>Metrikler
Kötü Koku</p>
      <p>Tespit
Algoritmaları
İçerir
Eclipse Eklentisi</p>
      <p>Kullanır</p>
      <p>Hesaplar
aracı hariç diğer araçlardan daha fazla kötü koku tespiti yapabilmektedir.
Eklentimizin IPLASMA’ya göre avantajı ise kötü koku tespitini bağımsız bir uygulama
olarak yapmaması, geliştirme ortamı üzerinden sunmasıdır. Bu sayede
yazılımcılar ürünü geliştirirken sürekli olarak kalite yönetimi yapabileceklerdir.
3</p>
    </sec>
    <sec id="sec-4">
      <title>Kötü Kokuların Tespitinin Gerçekleştirimi</title>
      <p>
        Eklentimiz Lanza ve Marinescu’nun kitabında [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] tanımlanmış, God Class,
Feature Envy, Data Class, Brain Method, Brain Class, Intensive Coupling,
Dispersed Coupling, Shotgun Surgery, Refused Parent Bequest, Tradition Breaker
olmak üzere toplam 10 adet kötü kokuyu yine aynı kitapta tanımı verilmiş 23
adet metrik kullanarak otomatik olarak tespit edebilme yeteneğine sahiptir.
      </p>
      <p>Şekil 1: Kötü kokuların tespitinin gerçekleştirimi
Tespit gerçekleştirimimiz Şekil 1’de özetlenmiştir. Gerçekleştirim sırasında
metrikleri toplamak için herhangi bir üçüncü parti kütüphane kullanılmamış, tüm
metrikler Eclipse platformunun sunduğu JDT (Java Development Tools)
kütüphanesiyle bu çalışmaya özel kodlar üzerinden toplanmış, doğrulukları birim
testleri ile kontrol edilmiştir.</p>
      <p>Eclipse JDT, çalışma ortamındaki projelerin kaynak kodlarından Soyut
Sözdizim Ağaçları (Abstract syntax trees) oluşturabilme yeteneğine sahiptir ve oluşan
bu ağaçlar yine Eclipse tarafından sunulan ASTVisitor sınıfı sayesinde
gezilebilmektedir. Eklentide her bir metrik değerinin hesaplanması için, ASTVisitor
sınıfından hesaplama yapacağımız sınıflar türetilerek visit ve endVisit metotları
yeniden gerçeklendi. Hesaplanan bu metrikler, kötü kokuların tespiti için kural
tabanlı algoritmalara girdi olarak kullanıldı.</p>
      <p>Tespit edilen her bir kötü koku için Eclipse platformu üzerinde bunları gösteren
işaretçi (marker) oluşturuldu. Oluşturulan her bir işaretçi, yine bizim
geliştirdiğimiz yeni bir ekran (view) üzerinden yazılımcı ve bakımcılara sunuldu. Bu
Java Kaynak</p>
      <p>Kodları
Kullanır</p>
      <p>Eklentimiz AST
üstünde gezerek
gerekli metrikleri
toplar.</p>
      <p>Ayrıştırır</p>
      <p>Eclipse JDT</p>
      <p>Oluşturur
ekran üzerinden yazılımcılar kötü koku barındıran sınıf ve metotları görerek,
ilgili kötü kokuyu içeren sınıf veya metoda ulaşıp gerekli düzenlemeleri yapabilir
hâle geldiler.</p>
      <p>
        Gerçekleştirilen eklentinin kaynak kodları Github hesabımız üzerinden erişime
ve kullanıma açılmıştır. [
        <xref ref-type="bibr" rid="ref33">33</xref>
        ] Daha önce yapılmış çalışmalar bizim hesapladığımız
kadar metrik hesaplamadığı için ve bizim kadar hesaplama yapan çalışmalar da,
kötü kokuları sadece tespit etmekle kalıp metrik değerlerini kullanıcılara
sunmadığı için; hesaplanan metriklerin doğruluğu başka bir çalışmayla
karşılaştırılamamış ve bu nedenle çok yoğun birim testlerle birlikte her biri birçok senaryo
ile doğrulanmıştır. Kötü kokular da bu metriklerin bir formulasyonu
olduğundan, otomatik olarak doğrulukları ispatlanmıştır. Kaynak kodlarımızı Github
[
        <xref ref-type="bibr" rid="ref33">33</xref>
        ] üzerinden paylaşarak, kötü koku tespitlerini otomatik olarak yapabilen bir
eklentiyle birlikte, doğrulukları ayrıntılı irdelenmiş metrik hesaplayıcı
sınıflarımızda erişime açılmıştır. Sonuç olarak ortaya çıkan eklentimizin görüntüsü Şekil
2’de verilmiştir.
      </p>
      <p>Kötü Koku İçeren Sınıf</p>
      <p>Süreç Ekranı</p>
      <p>Kötü Koku İçeren Metot
Kötü Koku Tipi</p>
      <p>Satır Numarası Sınıf Adı Kötü Koku İçeren Sınıfın Yolu</p>
      <p>Şekil 2: Eclipse eklenti görüntüsü
3.1</p>
      <sec id="sec-4-1">
        <title>Hesaplanan Metrikler</title>
        <p>
          Kötü kokuların tespitinin gerçekleştirimi için hesaplanması gereken tüm
metrikler Lanza ve Marinescu’nun kitabında [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] tanımlanmış, Tablo 1’de kısa tanımları
verilmiştir. Tanımı verilen tüm metrikler bizim kendi yazdığımız Java sınıfları
üzerinden hesaplanmış, herhangi bir üçüncü parti kütüphane kullanılmamıştır.
        </p>
        <p>Tablo 1: Kötü kokuların tespiti için hesaplanan metrikler</p>
      </sec>
      <sec id="sec-4-2">
        <title>Metrik Adı</title>
        <p>Average Method Weight
(AMW)</p>
      </sec>
      <sec id="sec-4-3">
        <title>Metrik Tanımı</title>
        <p>
          Ölçüm yapılacak sınıfın içerdiği metotların
karmaşıklıkları toplamının, sınıfın içerdiği toplam metot
sayısına oranıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Ölçüm yapılacak metot veya sınıfın, diğer sınıflardan
Access To Foreign Data (sınıfın ata sınıfları hariç) erişimci metotlar
(getter(ATFD) /setter) üzerinden veya direkt olarak eriştiği nitelik
(attribute) sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Base Class Overriding Ölçüm yapılacak sınıfta geçersiz kılınan (overridden)
Ratio (BOvR) metotların sayısının, sınıf içerisindeki tüm metot
sayısına oranıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Base Class Usage Ratio Ölçüm yapılacak sınıfta kalıtımdan gelen nitelik ve
(BUR) metotların kullanım oranıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
        </p>
        <p>
          Ölçüm yapılacak metodu çağıran metotların ait
olChanging Classes (CC) dukları farklı sınıfların sayısıdır. (Ölçüm yapılan
metodun kendi sınıfı dahil değildir.) [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]
Coupling Intensity Ölçüm yapılacak metodun diğer sınıflardan çağırdığı
(CINT) farklı metot sayıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Coupling Dispersion Ölçüm yapılacak metodun diğer sınıflardan çağırdığı
(CDISP) metotların ait oldukları sınıfların sayısının, CINT
metrik değerine bölünmesiyle bulunur. [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Changing Methods (CM) Ölçüm yapılacak metotu diğer sınıflardan çağıran
farklı metot sayısıdır. [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]
McCabe’s Cyclomatic
        </p>
        <p>Number (CYCLO)</p>
        <p>
          Ölçüm yapılacak metodun karmaşıklığıdır. [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ] [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Foreign Data Providers Ölçüm yapılacak metodun eriştiği niteliklerin (direkt
(FDP) veya erişimci metotlar üzerinden) tanımlandığı farklı
sınıf sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Ölçüm yapılacak metodun diğer sınıflardan eriştiği
Locality of Attribute niteliklerin sayısının, eriştiği tüm niteliklerin
sayıAccesses (LAA) sına oranıdır. (Kendi nitelikleri + erişilen diğer sınıf
nitelikleri)[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Lines of Code (LOC) Ölçüm yapılacak metodun satır sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]
(Satır sayısına, yorum satırları ve boşluklar dahildir.)
Maximum Nesting Level Ölçüm yapılacak metodun içe doğru dallanma
(MAXNESTING) sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Number of Added Ölçüm yapılan sınıfta, ata sınıftan kalıtımla
alınmaServices (NAS) mış ve geçersiz (override) kılınmamış public metot
sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Number of Accessor Ölçüm yapılacak sınıftaki erişimci metotların (getter
Methods (NOAM) / setter) sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Number of Accessed Ölçüm yapılacak metodun eriştiği değişken /
niteVariables (NOAV) lik sayısıdır. (parametreler, yerel değişkenler, nesne
nitelikleri, diğer sınıf nitelikleri)[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Number of Methods
(NOM)
Ölçüm yapılacak sınıftaki toplam metot sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Ölçüm yapılacak sınıftaki public nitelik sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
Number of Public
Attributes (NOPA)
Number of Protected
Members (NProtM)
Ölçüm yapılacak sınıftaki protected metot ve nitelik
sayısıdır.[
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
AdPdeercdenStearvgeiceosf (NPeNwAlyS) Ömlıçşüvme ygaepçeılrasnizsı(noıvfetarr,idatea) skıınlıınftmanamkaışlıtpı mubl
alicalmınemtoatsayısının, toplam public metot sayısına oranıdır.
        </p>
        <p>Ölçüm yapılacak sınıftaki, en az bir niteliğe ortak
Tight C(lTasCsCC)ohesion [ao1ll4aa]rna(okOlaleasrsıiıştetünümmmmmeeteottotottççiçififtftltlelereririnini:inn(mssaaeyytıoısstıınnsıaany,oısrsıaın*nııf(dtmıare.yt[oe5rt]
sayısı -1)) / 2)
Weighted(WMMetCho)d Count lÖıklçlaürmı tyoapplaılmacıadkır.sınBıifrtamkiettoüdmunmektaortmlaarşınıklkıakr mheasşaıkb-ı</p>
        <p>
          CYCLO metriği ile bulunur. [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ] [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ]
        </p>
        <p>Weigh(tWOOfCa)Class
pnÖıılcnçı,üvsmıenyıefartpiaşıkilmiactcaüikmmsıepntuıofbttllaaicrtamhnaeımrtioçlta)nspamuyıbışslıfinocanmkoseritayonotındseıalry.(yı[s5aı]-3.2</p>
      </sec>
      <sec id="sec-4-4">
        <title>Tespit Edilen Kötü Kokular</title>
        <p>God Class Sistemdeki yapılacak işlerin bir sınıf üzerinde merkezîleştirilmesi
problemidir. Sistemdeki birçok sorumluluk bu sınıfa yüklenmiştir.
8Sınıf diğer sınıfların niteliklerine erişmeli,
&gt;
&lt;
God Class Sınıfın fonksiyonel karmaşıklığı fazla olmalı,
&gt;:Sınıf düşük uyumluluğa sahip olmalı
AT F D &gt; 3
W M C 47
T CC &lt; 13
Feature Envy Bir metodun, diğer bir sınıfın verilerine kendi sınıfındaki
verilerden daha çok ihtiyaç duyması problemidir.</p>
        <p>Feature Envy
8Metot diğer sınıfların niteliklerine erişmeli,
&gt;
&gt;
&gt;&gt;&lt;Metot diğer sınıfların niteliklerine, kendi sınıfındaki</p>
        <p>niteliklerden daha fazla erişmeli,
&gt;&gt;&gt;Metodun diğer sınıflardan eriştiği nitelikler az
sa&gt;
:yıda sınıfa dağılmış olmalı
AT F D &gt; 3
LAA &lt; 31
F DP
3
Data Class Bu sınıflar kendi verileri üzerinde işlem yapmayan, sadece veri
tutan ve diğer sınıfların bu verilere eriştiği sınıflardır.</p>
        <p>8Sınıfın arayüzü fonksiyonellikten ziyade, daha çok
&gt;
&gt;
Data Class &lt;veri sunmalı,
&gt;Sınıfın, dışarıya açık çok sayıda niteliği var ve kar- (1)
&gt;:maşıklığı yüksek olmamalı
W OC &lt; 13
[(N OP A + N OAM &gt; 3) ^ (W M C &lt; 31)]</p>
        <p>_
[(N OP A + N OAM &gt; 7) ^ (W M C &lt; 47)]
Brain Method Bir metodun bulunduğu sınıfa ait işlerin çoğunu
üstlenmesinden kaynaklanır. Metodu yönetmek ve anlamak zorlaşır.</p>
        <p>8&gt;Metot oldukça büyük olmalı,
&gt;
&gt;&gt;&gt;Metot birçok koşullu dallanmaya
sa&lt;</p>
        <p>hip olmalı,
&gt;&gt;Metot birçok iç içe seviye içermeli,
&gt;
&gt;
&gt;:Metot birçok değişken kullanmalı
LOC &gt; 65
CY CLO</p>
        <p>4
M AXN EST IN G
N OAV &gt; 7
3
Brain Class God class kötü kokusuna çok benzer. Çünkü sistemde yapılacak
işler bu sınıflar üzerinde merkezîleştirilmiştir. Ancak aralarında temel farklar
vardır. God class sadece büyük karmaşık sınıflar değildir. Diğer sınıfların
verilerine direkt olarak ulaşırken, kapsülleme kurallarını bozan sınıflardır. Brain class
kötü kokusundan etkilenmiş sınıflar da büyük sınıflardır ama daha uyumlu
(cohesive) sınıflardır ve en az 1 Brain Method kötü kokusuna sahip metot içermek
zorundadırlar.</p>
        <p>8Sınıf birden fazla Brain Method kötü kokusuna sahip (1)
&gt;
Brain Class &gt;&lt;metot içermeli ve büyük olmalı ya da sınıf 1 adet Brain
&gt;Method içermeli ancak çok büyük olmalı,
&gt;:Sınıfın karmaşıklığı yüksek, uyumluluğu ise düşük olmalı (2)
(1) =&gt;
[(Birden fazla Brain Method var) ^ (LOC
195)]
_
[(Sadece 1 Brain Method ’a sahip) ^ (LOC
390) ^ (W M C
(2) =&gt; (W M C
47) ^ (T CC &lt;
Intensive Coupling Bir metodun, birkaç sınıfta toplanmış birçok metodu
çağırması problemidir.</p>
        <sec id="sec-4-4-1">
          <title>8&gt;Metot birden fazla iç içe koşul</title>
          <p>Intensive Coupling &gt;&lt;içermeli,
&gt;Metot birkaç sınıfta toplanmış (1)
&gt;:birçok metodu çağırmalı</p>
          <p>M AXN EST IN G &gt; 1
1 1
(1) =&gt; (CIN T &gt; 7 ^ CDISP &lt; 2 ) _ (CIN T &gt; 3 ^ CDISP &lt; 4
)
Dispersed Coupling Bir metodun, birçok farklı sınıfta yer alan birçok metodu
çağırması problemidir.</p>
        </sec>
        <sec id="sec-4-4-2">
          <title>8&gt;Metot birden fazla iç içe koşul</title>
          <p>Dispersed Coupling &gt;&lt;içermeli,
&gt;Metot birçok farklı sınıfta yer (1)
&gt;:alan birçok metodu çağırmalı
(1) =&gt; (CIN T &gt; 7) ^ (CDISP
Shotgun Surgery Sistemdeki bir metodun, farklı sınıflarda yer alan birçok
metot tarafından çağırılması problemidir.</p>
        </sec>
        <sec id="sec-4-4-3">
          <title>8&gt;Metot çok sayıda başka metot tarafın</title>
          <p>&gt;
Shotgun Surgery &lt;dan çağırılmalı,
&gt;Metodu çağıran metotlar birçok sınıfa
&gt;
:dağılmalı
CM &gt; 7
CC &gt; 10
Refused Parent Bequest Çocuk sınıfların, ata sınıftan kalıtımla gelen üyeleri
(metotları ve nitelikleri) kullanmaması veya az kullanması problemidir.
)
Tradition Breaker Çocuk sınıfların, ata sınıflarından daha çok hizmet sunması
mantıklı bir durumdur. Ancak çocuk sınıflar, ata sınıfın geleneğini sürdürmelidir.
Bu kötü koku çocuk sınıfların ata sınıflarıyla ilişkisiz birçok yeni hizmet sunması
problemidir.</p>
          <p>8Çocuk sınıfın arayüzündeki artış çok (1)
&gt;
&gt;&gt;&gt;fazla olmalı,
&gt;
Tradition Breaker &lt;Çocuk sınıfın karmaşıklığı ve boyutu (2)
&gt;çok büyük olmalı,
&gt;
&gt;&gt;&gt;Ata sınıf çok küçük ve işlevsiz olma- (3)
:malı
(1) =&gt; (N AS
7) ^ (P N AS
(3) =&gt; (AM W &gt; 2) ^ (N OM &gt; 5) ^ (W M C</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Kötü Koku Analizleri</title>
      <p>
        Geliştirdiğimiz eklenti Apache Log4j (1.2) [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], Apache Ivy (2.0) [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], PBeans
(1.0) [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], Apache Velocity (1.4) [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], Apache Tomcat (6.0.38) [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ], Apache POI
(2.0rc1) [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ],Apache Synapse (1.0) [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] olmak üzere 7 adet açık kaynak proje
üzerinde denenmiştir. Bu projelerin üzerinde çalışılmasının temel nedeni, bu
projelerin hata veri kümelerinin (fault-dataset) herkese açık olarak sunulmasıdır.
Normalde bu veri kümeleri hata tahmini (fault-estimation) için
kullanılmaktadır. Ancak kötü kokularla hata oluşumunun ilişkisinin gösterilmesi açısından
bizim içinde güzel bir girdi olmuşlardır. İlişki gösterilirken veri kümelerindeki
hata bilgisi aynen korunmuştur. Kullandığımız veri kümeleri Marian Jureckzo
tarafından tera-promise üzerinden sunulmuştur.[
        <xref ref-type="bibr" rid="ref24">24</xref>
        ] [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ] [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ] [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ] [
        <xref ref-type="bibr" rid="ref30">30</xref>
        ].
Hata veri kümeleri bulunan bu projelerde eklentimiz denenerek, kötü kokuların
hata oluşumundaki etkisi gözlemlenmiştir.
      </p>
      <p>Tablo 2: Yazılımda yer alan kötü kokuların ve hatalarının istatistiksel dağılımı
Toplam Sınıf Sayısı
Hatalı Sınıf Sayısı / Hata İçermeyen Sınıf Sayısı
Kötü Koku İçeren Sınıf Sayısı / Kötü Koku
İçermeyen Sınıf Sayısı
Toplam Hata Sayısı
Toplam Kötü Koku Sayısı
Hata İçeren Sınıflardaki Maksimum Hata Sayısı
Kötü Koku İçeren Sınıflardaki Maksimum Kötü
Koku Sayısı
Hata İçeren Sınıflardaki Ortalama Hata Sayısı
Kötü Koku İçeren Sınıflardaki Ortalama Kötü Koku
Sayısı</p>
      <p>Projelerdeki ortak bulgu; hata sayısı fazla olan projelerin kötü koku sayısının
da fazla olmasına rağmen, hata ile kötü koku arasında varoluşsal bir ilişkinin
olmadığıdır. Örneğin log4j için açık biçimde hata ve kötü koku arasında
varoluşsal bir ilişki mevcut iken, synapse için tam tersi bir durum görülmektedir. Kötü
kokuların, projenin tüm sınıflarına yayılmak yerine, belli sınıflarında
yoğunlaştığı da Tablo 2 içinde yer alan kötü koku içeren/kötü koku içermeyen sınıflar
ve ortalama kötü koku sayısı değerlerinden anlaşılmaktadır. Genel olarak hatalı
sınıfların hata sayısı, kötü koku içeren sınıfların kötü koku sayısından düşüktür.
Bu durum hayatın içinde de olağandır çünkü hatanın fark edilmesi için
testler ve yazılımın kullanılması gibi doğal süreçler çalışır ve hataların azaltılması
çabalanır. Ancak kötü kokular için böylesi bir düzenleyici ve önleyici faaliyetin
olmaması nedeniyle kaynak kodun doğal gelişimi içinde mevcudiyetlerini
korumaya devam ederler. İstatistiksel dağılımda Tomcat projesinde diğer projelere
göre oldukça yoğun bir kötü koku mevcudiyeti görülmektedir. Bu projeyi
genel değerlendirmenin dışında tutarsak, Tradition Breaker kötü kokusunun en az
rastlanan kötü koku olduğunu ve Brain Class, God Class kötü kokularının diğer
en az karşılaşılan kötü koku türü olduğu söylenebilir.
5</p>
    </sec>
    <sec id="sec-6">
      <title>Sonuçlar</title>
      <p>Yapılan çalışma sonucunda, Java projelerindeki kaynak kodlar içerisinde yer alan
kötü kokuları otomatik olarak bulan bir Eclipse eklentisi geliştirdik. Bu eklentiyle
birlikte yazılımın kalitesi gerçekçi değerlerle ölçülebilecek, üretkenlik
iyileştirilebilecek, hatalı modüller erkenden tespit edilip düzeltilebilecek, maliyet azaltılıp,
bakım ve test edilebilirlik arttırılabilecektir.</p>
      <p>Kötü koku tespit aracımızın kullanımını örneklemek ve bunlar ile ilgili durumu
yansıtabilmek için; Tera Promise kapsamında Svn ve Sourceforge üzerinden
kaynak kodlarına erişilebilen projeler kullanılmış ve projelerin mevcut hata bilgileri
ile bu çalışmada tespit edilen kötü kokular bir arada verilerek, yazılım
geliştiricilerin sıklıkla hangi kötü koku türlerini yapmaya açık olduğu tespit edilmeye
çalışılmıştır. Kötü kokuların yazılım üzerindeki etkilerini ölçmek için, kötü koku
içeren ve bilinen kötü kokuları içermeyen kaynak kodların bakım sürelerinin ve
bakım sonrası hata istatistiklerinin karşılaştırılması gerekmektedir. Özellikle
birden çok sınıfın etkilendiği bakım faaliyetleri önemli olacağı düşünülmektedir. Bu
nedenle, şu an kendi içinde metrik toplama ve kötü koku tespit etme eklentisi
için, gelecek çalışmalarda üç yönelim olacaktır: (I) Tespit edilen kötü kokulara ait
literatürde sunulan düzeltme önerilerinin otomatik olarak kod içine yansıtılması
(II) Kötü kokuların kodun bakım pratiklerine süre ve bakım sonrası hata oluşumu
üzerine etkisinin deneylerle irdelenmesi.(III) Gerçeklenen eklentinin çıktılarının
literatürde kabul görmüş IPLASMA programı ile karşılaştırılması.</p>
    </sec>
    <sec id="sec-7">
      <title>Kaynaklar</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>Martin</given-names>
            <surname>Fowler</surname>
          </string-name>
          .
          <article-title>Refactoring: Improving the Design of Existing Code. Addison-Wesley Longman Publishing Co</article-title>
          . Inc., Boston, MA, USA, (
          <year>1999</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>M.</given-names>
            <surname>Mäntylä</surname>
          </string-name>
          ,
          <article-title>Bad smells in software - a taxonomy and an empirical study</article-title>
          .
          <source>Ph.D. dissertation</source>
          , Helsinki University of Technology,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>W. C.</given-names>
            <surname>Wake</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Refactoring</given-names>
            <surname>Workbook</surname>
          </string-name>
          . Boston, MA, USA: Addison Wesley Longman Publishing Co., Inc.,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>R.</given-names>
            <surname>Marinescu</surname>
          </string-name>
          ,
          <article-title>Detection strategies: Metrics-based rules for detecting design flaws</article-title>
          ,
          <source>in Proceedings of the 20th International Conference on Software Maintenance</source>
          . IEEE Computer Society Press,
          <year>2004</year>
          , pp.
          <fpage>350</fpage>
          -
          <lpage>359</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>M.</given-names>
            <surname>Lanza</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Marinescu</surname>
          </string-name>
          , Object-Oriented Metrics in Practice. Springer-Verlag,
          <year>2006</year>
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>C.</given-names>
            <surname>Marinescu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Marinescu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Mihancea</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Ratiu</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Wettel</surname>
          </string-name>
          .
          <article-title>iplasma: An integrated platform for quality assessment of objectoriented design</article-title>
          .
          <source>In Proceedings of 21st International Conference on Software Maintenance (ICSM</source>
          <year>2005</year>
          ), Tools Section,
          <year>2005</year>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>M.</given-names>
            <surname>Fokaefs</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Tsantalis</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Chatzigeorgiou</surname>
          </string-name>
          ,
          <article-title>JDeodorant: Identification and Removal of Feature Envy Bad Smells</article-title>
          ,
          <source>IEEE International Conference on Software Maintenance</source>
          ,
          <year>2007</year>
          October, pp.
          <fpage>519</fpage>
          -
          <lpage>520</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>T.</given-names>
            <surname>Chaikalis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Tsantalis</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Chatzigeorgiou</surname>
          </string-name>
          ,
          <source>JDeodorant: Identification and Removal of TypeChecking Bad Smells, 12th European Conference on Software Maintenance and Reengineering</source>
          ,
          <year>2008</year>
          , pp.
          <fpage>329</fpage>
          -
          <lpage>331</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9. JDeodorant http://marketplace.eclipse.org/content/jdeodorant [Accessed May
          <year>2018</year>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Emerson</surname>
            Murphy-Hill and
            <given-names>Andrew P.</given-names>
          </string-name>
          <string-name>
            <surname>Black</surname>
          </string-name>
          ,
          <article-title>An interactive ambient visualization for code smells</article-title>
          ,
          <source>Proceedings of SOFTVIS '10</source>
          , USA,
          <year>October 2010</year>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>11. https://pmd.github.io/ [Accessed May 2018]</mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>Mark</given-names>
            <surname>Lorenz</surname>
          </string-name>
          and
          <string-name>
            <given-names>Jeff</given-names>
            <surname>Kidd</surname>
          </string-name>
          .
          <article-title>Object-Oriented Software Metrics: A Practical Guide</article-title>
          . Prentice-Hall,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Shyam</surname>
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Chidamber</surname>
            and
            <given-names>Chris F.</given-names>
          </string-name>
          <string-name>
            <surname>Kemerer</surname>
          </string-name>
          .
          <article-title>A metrics suite for object oriented design</article-title>
          .
          <source>IEEE Transactions on Software Engineering</source>
          ,
          <volume>20</volume>
          (
          <issue>6</issue>
          ):
          <fpage>476</fpage>
          -
          <lpage>493</lpage>
          , June 1994
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>J.M. Bieman</surname>
            and
            <given-names>B.K.</given-names>
          </string-name>
          <string-name>
            <surname>Kang</surname>
          </string-name>
          .
          <article-title>Cohesion and reuse in an objectoriented system</article-title>
          .
          <source>In Proceedings ACM Symposium on Software Reusability</source>
          ,
          <year>April 1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>T.J. McCabe</surname>
          </string-name>
          .
          <article-title>A measure of complexity</article-title>
          .
          <source>IEEE Transactions on Software Engineering</source>
          ,
          <volume>2</volume>
          (
          <issue>4</issue>
          ):
          <fpage>308</fpage>
          -
          <lpage>320</lpage>
          ,
          <year>December 1976</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <given-names>Radu</given-names>
            <surname>Marinescu</surname>
          </string-name>
          .
          <article-title>Measurement and Quality in Object-Oriented Design</article-title>
          .
          <source>PhD thesis</source>
          , Department of Computer Science, Politehnica University of Timis¸oara,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <source>Apache Log4j 1</source>
          .2 Source Code http://svn.apache.org/repos/asf/logging/ log4j/tags/v1_2_1/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <issue>Apache Ivy 2</issue>
          .0 Source Code http://svn.apache.org/repos/asf/ant/ivy/core/ tags/2.0.0/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>19. PBeans 1.0 Source Code https://sourceforge.net/projects/pbeans/files/ pbeans/1.0/ [Accessed May 2018]</mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <issue>Apache Velocity 1</issue>
          .4 Source Code https://svn.apache.org/repos/asf/ velocity/tools/tags/1.4/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21.
          <source>Apache Tomcat 6.0</source>
          .38 Source Code http://svn.apache.org/repos/asf/tomcat/ archive/tc6.0.x/tags/TOMCAT_6_0_38/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          22.
          <issue>Apache Poi 2</issue>
          .
          <fpage>0</fpage>
          .rc1 Source Code http://svn.apache.org/repos/asf/poi/tags/ REL_2_0_RC1/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          23.
          <issue>Apache Synapse 1</issue>
          .0 Source Code http://svn.apache.org/repos/asf/synapse/ tags/1.0/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          24.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>tomcat [Data set]</article-title>
          .
          <source>Zenodo</source>
          . https://doi.org/10.5281/ zenodo.322454 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          25.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>velocity [Data set]</article-title>
          .
          <source>Zenodo</source>
          . https://doi.org/10.5281/ zenodo.322455 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          26.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>synapse [Data set]</article-title>
          .
          <source>Zenodo</source>
          .https://doi.org/10.5281/ zenodo.322449 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          27.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>poi [Data set]</article-title>
          .
          <source>Zenodo</source>
          . https://doi.org/10.5281/ zenodo.322443 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          28.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>pbeans [Data set]</article-title>
          .
          <source>Zenodo</source>
          . https://doi.org/10.5281/ zenodo.322440 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          29.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>log4j [Data set]</article-title>
          .
          <source>Zenodo</source>
          . https://doi.org/10.5281/ zenodo.268451 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          30.
          <string-name>
            <surname>Marian</surname>
            <given-names>Jureckzo.</given-names>
          </string-name>
          (
          <year>2010</year>
          ).
          <article-title>ivy [Data set]</article-title>
          .
          <source>Zenodo</source>
          . https://doi.org/10.5281/ zenodo.322436 [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>31. https://www.tiobe.com/tiobe-index/ [Accessed May 2018]</mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          32. https://zeroturnaround.com/rebellabs/developer-productivity
          <string-name>
            <surname>-</surname>
          </string-name>
          report
          <article-title>-2017-whydo-you-use-java-</article-title>
          <string-name>
            <surname>tools-</surname>
          </string-name>
          you-use/ [Accessed May 2018]
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>33. https://github.com/MelihAltintas/AutomaticJavaCodeSmellDetector</mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>