Basit Bir Abstraction ÖrneğiObject Oriented tasarım ve programlamada soyutlamanın her zaman önemini vurgulamışımdır. Yazılım geliştirirken soyutlamalar sayesinde yazılımı daha yönetilebilir parçalara, modüllere ayırıp daha esnek yazılımlar geliştirebiliyoruz. Buna geliştirdiğim yazılımdan küçük bir örnek vermek istedim.
Geçenlerde Hibernate Log dosyalarını parse eden bir program yazdığımı belirtmiştim. Program belirli bir dizideki .log uzantılı dosyaları parse edip içlerinden SQL cümlelerini çıkarıyordu. Ekranda bulunan bir butonun altında yazılan kodda seçilen log dizininin altındaki log dosyalarını alıp
Parser sınıfına işlemesi için gönderiyordu. Kodun ilk yazılan şekli aşağıdaki gibiydi.
- Kod:
-
[table]
[tr]
[td class=number]01[/td]
[td class=content][b][color=#006699]private[/color][/b] [b][color=#006699]void[/color][/b] openFileActionPerformed(java.awt.event.ActionEvent evt) { [/td][/tr][/table]
[table]
[tr]
[td class=number]02[/td]
[td class=content][b][color=#006699]try[/color][/b] { [/td][/tr][/table]
[table]
[tr]
[td class=number]03[/td]
[td class=content][color=#008200]//log dosyalarını seçili dizinden alıyoruz [/color][/td][/tr][/table]
[table]
[tr]
[td class=number]04[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]05[/td]
[td class=content]File directory =fc.getSelectedFile(); [/td][/tr][/table]
[table]
[tr]
[td class=number]06[/td]
[td class=content]FilenameFilter filter = [b][color=#006699]new[/color][/b] FilenameFilter() { [/td][/tr][/table]
[table]
[tr]
[td class=number]07[/td]
[td class=content][b][color=#006699]public[/color][/b] [b][color=#006699]boolean[/color][/b] accept(File dir, String name) { [/td][/tr][/table]
[table]
[tr]
[td class=number]08[/td]
[td class=content][b][color=#006699]return[/color][/b] name.endsWith([color=#0000ff]".log"[/color]); [/td][/tr][/table]
[table]
[tr]
[td class=number]09[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]10[/td]
[td class=content]}; [/td][/tr][/table]
[table]
[tr]
[td class=number]11[/td]
[td class=content]File[] files =directory.listFiles(filter); [/td][/tr][/table]
[table]
[tr]
[td class=number]12[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]13[/td]
[td class=content][color=#008200]//***************** [/color][/td][/tr][/table]
[table]
[tr]
[td class=number]14[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]15[/td]
[td class=content][b][color=#006699]for[/color][/b] (File file : files) { [/td][/tr][/table]
[table]
[tr]
[td class=number]16[/td]
[td class=content]Parser parser = [b][color=#006699]new[/color][/b] Parser(file); [/td][/tr][/table]
[table]
[tr]
[td class=number]17[/td]
[td class=content]sqlLogs = parser.parse(); [/td][/tr][/table]
[table]
[tr]
[td class=number]18[/td]
[td class=content][b][color=#006699]for[/color][/b] (SqlLog sqlLog : sqlLogs) { [/td][/tr][/table]
[table]
[tr]
[td class=number]19[/td]
[td class=content]listModel.addElement(sqlLog); [/td][/tr][/table]
[table]
[tr]
[td class=number]20[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]21[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]22[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]23[/td]
[td class=content]} [b][color=#006699]catch[/color][/b] (Exception ex) { [/td][/tr][/table]
[table]
[tr]
[td class=number]24[/td]
[td class=content]showMessage(ex.getMessage()); [/td][/tr][/table]
[table]
[tr]
[td class=number]25[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]26[/td]
[td class=content]}[/td][/tr][/table]
Yukarıdaki basit bir işlem fakat metodun iki işi bir arada yaptığını fark ettiniz umarım. Log dosyalarını listeleme ve bu dosyaları parse etme. Ayrıca uygulamamı düşündüğümde şöyle bir ihtiyacım olduğunu anlıyorum.Uygulamam “Log dizinindeki dosyaları parse etme” işlemini yapıyor. Bu yüzden basit ama kodu ve yönetimi arttıran yeni bir sınıf ekliyorum. Aslında kısacası soyutlama yapıyorum. Uygulamam da daha önceden geçen “Log Dizini” dediğim kavram için bir sınıf oluşturuyorum. Kodu aşağıdaki gibi değiştirdim.
[table]
[tr]
[td class=number]
- Kod:
-
01[/td]
[td class=content][b][color=#006699]public[/color][/b] [b][color=#006699]class[/color][/b] LogDirectory { [/td][/tr][/table]
[table]
[tr]
[td class=number]02[/td]
[td class=content][b][color=#006699]private[/color][/b] File directory; [/td][/tr][/table]
[table]
[tr]
[td class=number]03[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]04[/td]
[td class=content][b][color=#006699]public[/color][/b] LogDirectory(File directory) { [/td][/tr][/table]
[table]
[tr]
[td class=number]05[/td]
[td class=content][b][color=#006699]this[/color][/b].directory = directory; [/td][/tr][/table]
[table]
[tr]
[td class=number]06[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]07[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]08[/td]
[td class=content][b][color=#006699]public[/color][/b] File[] getLogFiles() { [/td][/tr][/table]
[table]
[tr]
[td class=number]09[/td]
[td class=content]FilenameFilter filter = [b][color=#006699]new[/color][/b] FilenameFilter() { [/td][/tr][/table]
[table]
[tr]
[td class=number]10[/td]
[td class=content][b][color=#006699]public[/color][/b] [b][color=#006699]boolean[/color][/b] accept(File dir, String name) { [/td][/tr][/table]
[table]
[tr]
[td class=number]11[/td]
[td class=content][b][color=#006699]return[/color][/b] name.endsWith([color=#0000ff]".log"[/color]); [/td][/tr][/table]
[table]
[tr]
[td class=number]12[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]13[/td]
[td class=content]}; [/td][/tr][/table]
[table]
[tr]
[td class=number]14[/td]
[td class=content][b][color=#006699]return[/color][/b] directory.listFiles(filter); [/td][/tr][/table]
[table]
[tr]
[td class=number]15[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]16[/td]
[td class=content]}[/td][/tr][/table]
Yukarıdaki kodda basit bir soyutlama yaptım. Log dizinindeki dosyaları getiren işi ayrı bir sınıf olarak uygulamaya ekledim.Metod aşağıdaki hale geldi.
[table]
[tr]
[td class=number]
- Kod:
-
01[/td]
[td class=content][b][color=#006699]private[/color][/b] [b][color=#006699]void[/color][/b] openFileActionPerformed(java.awt.event.ActionEvent evt) { [/td][/tr][/table]
[table]
[tr]
[td class=number]02[/td]
[td class=content][b][color=#006699]try[/color][/b] { [/td][/tr][/table]
[table]
[tr]
[td class=number]03[/td]
[td class=content]LogDirectory logDirectory =[b][color=#006699]new[/color][/b] LogDirectory(fc.getSelectedFile()); [/td][/tr][/table]
[table]
[tr]
[td class=number]04[/td]
[td class=content]File[] files = logDirectory.getLogFiles(); [/td][/tr][/table]
[table]
[tr]
[td class=number]05[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]06[/td]
[td class=content][b][color=#006699]for[/color][/b] (File file : files) { [/td][/tr][/table]
[table]
[tr]
[td class=number]07[/td]
[td class=content]Parser parser = [b][color=#006699]new[/color][/b] Parser(file); [/td][/tr][/table]
[table]
[tr]
[td class=number]08[/td]
[td class=content]sqlLogs = parser.parse(); [/td][/tr][/table]
[table]
[tr]
[td class=number]09[/td]
[td class=content][b][color=#006699]for[/color][/b] (SqlLog sqlLog : sqlLogs) { [/td][/tr][/table]
[table]
[tr]
[td class=number]10[/td]
[td class=content]listModel.addElement(sqlLog); [/td][/tr][/table]
[table]
[tr]
[td class=number]11[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]12[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]13[/td]
[td class=content][/td][/tr][/table]
[table]
[tr]
[td class=number]14[/td]
[td class=content]} [b][color=#006699]catch[/color][/b] (Exception ex) { [/td][/tr][/table]
[table]
[tr]
[td class=number]15[/td]
[td class=content]showMessage(ex.getMessage()); [/td][/tr][/table]
[table]
[tr]
[td class=number]16[/td]
[td class=content]} [/td][/tr][/table]
[table]
[tr]
[td class=number]17[/td]
[td class=content]}[/td][/tr][/table]
Küçükde olsa bu tarz soyutlamanın uygulama için oldukça önemli olduğunu düşünüyorum.