Nesne yönelimli yazılımlarda karşıt kalıpların belirlenmesi
Antipattern detection in object oriented software
Yazar: MEHMED TAHA ARAS
Danışman: YRD. DOÇ. DR. YUNUS EMRE SELÇUK
Yıldız Teknik Üniversitesi / Fen Bilimleri Enstitüsü / Bilgisayar Mühendisliği Ana Bilim Dalı
Derece: Yüksek Lisans, 2016
Konu: Bilgisayar Mühendisliği Bilimleri-Bilgisayar ve Kontrol = Computer Engineering and Computer Science and Control

Özet:
Kalıplar tasarımı geliştirmek ve bunun sonucunda sürdürülebilirliği, yeniden kullanılabilirliği ve tersine mühendisliği iyileştirmek için kullanılan önemli tekniklerdir. Nesne yönelimli yazılımlarda yaygın olarak meydana gelen problemlere karşı yeniden kullanılabilir olan genel çözümlere ise tasarım kalıpları denmektedir. Tasarım kalıpları yaygın problemleri çözmek için kullanabilecek biçimselleştirilmiş üstün yöntemler şeklindedir. Karşıt kalıplar ise tekrar eden bir probleme karşı yaygın olarak uygulanan, tasarım kalıbı olarak düşünülen fakat aksine genellikle verimsiz ve riskli çözümlerdir. Bazı çalışmalar göstermiştir ki, karşıt kalıpların kullanılması yazılım sistemlerinin sürdürülebilirliği üzerinde olumsuz etkilere sahiptir.
Kod kokusu (kötü koku) zayıf tasarım ve geliştirmenin ve daha derin bir problemin semptomlarıdır. Bazı durumlarda bu semptomlar yazılım geliştiricilerin önemli yamalar geliştirirken acele etmelerinden ya da yerinde olmayan tercihler vermelerinden kaynaklanır. Kod kokuları kodun anlaşılabilirliğini düşürür, aynı zamanda hata ve değişim meyillidirler. Bu yüzden kod kokularının tespit edilmesi ve gerektiği zaman da düzeltme işlemlerinin planlanıp uygulanması gerekmektedir. Kod kokuları aynı zamanda karşıt kalıpların belirtileri olarak da karşımıza çıkmaktadır. Bir karşıt kalıp, bir ya da daha fazla kod kokusunun bir araya gelmesinden, ya da bazı kod metriklerinin belirli sınırları aşmasından meydana gelebilmektedir.
Bu çalışma, Java nesne yönelimli programlama dilinde yazılmış projeleri analiz ederek, bazı kod kokuları ve metrik değerlerinin hesaplanmasını ve bu değerlerin referans aralıklarda olup olmamasına göre karşıt kalıp içeren sınıfların tespit edilmesini amaçlamaktadır. Karşıt kalıp tespitinde metrik tabanlı analizin yanında kod üzerinde bazı kokuların varlığını gösteren bazı kurallara dayalı doğrulamalar da yapılmaktadır. Varlığının tespit edilmesi amaçlanan karşıt kalıplar Blob, Swiss Army Knife ve Lava Flow karşıt kalıplarıdır. Bu karşıt kalıpların tespit edilmesi için projenin kaynak kod dosyalarını ve binary dosyalarını girdi olarak alan otomatik bir yaklaşım kullanılmaktadır. Sınıflar kendi içlerinde ve birbirleriyle etkileşimli olarak analiz edilip bazı metrikler çıkarılmaktadır. Baz alınan projelerin hesaplanan metrik değerleri üzerinde aykırı değer filtrelemesi yapıldıktan sonra ortaya çıkan ortalamalar ile referans değerler oluşmaktadır. Bu referans değerlerin dışında olan sınıflar potansiyel karşıt kalıp olarak tespit edilmektedir. Apache'nin 3 projesi ve büyük bir havayolu şirketinin 3 projesi referans projeler olarak analiz edilmiş ve filtrelenmiş ortalama değerleri baz alınmıştır. Ayrıca incelenen projenin filtrelenmiş ortalama değerleri ve yaygın olarak bilinen bazı metriklerin kabul edilen sınır değerleri de göz önünde bulundurulmuştur. Karşıt kalıp olarak veya normal olarak işaretlenen sınıflar kontrol edilerek geliştirilen yazılımın ürettiği sonuçların doğruluğu hesaplanmaya çalışılmıştır.

Abstract:
Patterns are significant techniques which improve design and consequently enhance maintainability, reusability and reengineering. Design patterns are common solutions that can be reused against generally occurring problems. Design patterns are used as efficient techniques to common problems. Antipatterns are inefficient and risky solutions which are used against recurring problems, considering that they are design patterns. Some studies have shown that using antipatterns has some negative effects on maintainability of software systems.
Code smells (bad smell) are symptoms of weak design and development or a deeper problem.  Sometimes these symptoms are caused from developers who try to finish their tasks as immediate as possible and making wrong decisions. Code smells decreases the understandability of code and they generally are error and change prone. Thus code smells need to be detected carefully and refactored if necessary. At the same time one or more code smells can be symptoms of an antipattern. An antipattern can show up by existence of some code smells or some code metrics which exceed the threshold values that are determined previously.
This study aims to detect antipatterns by calculating some code smells and metric values in projects that were written in Java object oriented programming language. Also some validations are used to detect code smells on the source code depending on some rules. Inspected antipatterns in our study are Blob, Swiss Army Knife and Lava Flow. An automated approach which takes source code files and binary files as input to detect antipatterns. Classes are analyzed by their own source codes and comparatively with each others. After outlier filtering is applied on some reference projects, averages of metric values show our reference value ranges to detect antipatterns. Classes which are out of these ranges are determined as potential antipatterns. 3 projects of Apache and 3 projects of one of the biggest airline companies are analyzed as our reference projects and filtered average values are used to determine thresholds. Also subject project and accepted values of some known metrics in literature were considered to determine thresholds. Classes that are marked as antipatterns or regular were controlled and accuracy results were tried obtain.