Refactoring – Introduce Parameter Object

Eski kodu yeniden düzenlemek gerçekten zahmetli bir iş. Birde bunu yaparken etrafta Unit Test yoksa vay halinize.Çünkü değiştirdiğiniz herhangi bir kod sonucunda programın çalışıp çalışmayacağından asla emin olamıyorsunuz. Eski kodu refactoring yaparken öncelikle yapmanız gereken eski kod için Unit Testlerin hazırlanması ardından da refactoring yapılması. Zaten Eski kodu refactoring yapmak başlı başına ayrı bir konu. Bu konuda en iyi kaynaklardan birinde Working Effectively with Legacy Code kitabı. Daha önceden de okunacaklar listesinde belirtmiştim gerçekten çok faydalı kitap.Kitapta şöyle bir tanımlama yapıyor Michael C. Feathers . Unit Test’i olmayan kod eski koddur. Bizimde önümüzdeki 5-10 sene genelde Testi yazılmamış eski kodlarla çalışacağımızı düşünürsek önemi dahada artıyor. Bu konuda uygulanacak tekniklerden vaktim oldukça bende bahsetmeye çalışacağım.

Neyse konuyu fazla uzatmadan örneğimize başlayalım.Şu sıralar çalıştığım projede daha önceden yazılmış eski kodu refactoring yapıyorum. Genelde kodda şu şekilde sınıflar ortalıkta geziyordu;



public class MessageProcessor {
    private Converter converter;   
    //.....
   
    public void process(byte[] data,String message,int messageID){
        if(data!=null && data.length>0 && message!=null && !message.equals("")){
            BaseMessage baseMesage =converter.convert(data,message,messageID);
            //...
        }       
    }
}


Yukarıdaki kodda belki ilk başta görmesi zor olabilir ama dikkar ederseniz process metodunun parametreleri olan ayrıca convert metodunada iletilen byte[] data,String message,int messageID göreceksiniz. MessageProcessor sınıfında gördüğünüz gibi bu parametrelere ait çeşitli kontroller yapılıyor. Yazmaya gerek duymadım ayrıca işlemler aslında Converter sınıfının convert metodunda da tekrarlanıyor. Birden fazla parametrenin çeşitli metodlara genelde beraber olarak geçildiğini gördüğünüzde ilk olarak yapmanız gereken bu parametreleri kendi sınıf alanı olarak kullanan yeni bir sınıf üretmektir işte bu sınıfa Parameter Object denir. Aşağıda kodun ve yeni oluşturduğumuz Parameter Object sınıfımızı görebilirsiniz.



public class MessageProcessor {
    private Converter converter;
    //.....

    public void process(Message message){
if(message.getData()!=null && message.getData().length>0 
&& message.getMessage()!=null && !message.getMessage).equals("")){
            //....
            BaseMessage baseMesage =converter.convert(message);
            //...
        }
    }
}

class Message {
    private byte[] data;
    private String message;
    private int messageID;
    public Message(byte[] data, String message, int messageID) {
        this.data = data;
        this.message = message;
        this.messageID = messageID;
    }
    public byte[] getData() {
        return data;
    }

    public String getMessage() {
        return message;
    }

    public int getMessageID() {
        return messageID;
    }
}


Gördüğünüz gibi bu parametreleri bir sınıfta topladık ve ardından onların yerine ihtiyaç duyan sınıflara bu yeni oluşturduğumuz Message parametresini gönderdik. Genellikle bu tarz bir Parameter Object oluşturduğumuzda daha önceden oluşturmadan önceki parametrelere ait yapılan kontroller işlemlerinde bu sınıfa taşınması daha doğru olacaktır. Yani ikinci aşamada kodumuzu bu şekilde değiştirebiliriz.



public class MessageProcessor {
    private Converter converter;
    //.....

    public void process(Message message){
        //.....
        if(message.isValid()){          
            BaseMessage baseMesage =converter.convert(message);
            //...
            //...
        }
    }

}

class Message {
    private byte[] data;
    private String message;
    private int messageID;
    public Message(byte[] data, String message, int messageID) {
        this.data = data;
        this.message = message;
        this.messageID = messageID;
    }
    public byte[] getData() {
        return data;
    }

    public String getMessage() {
        return message;
    }

    public int getMessageID() {
        return messageID;
    }

    public boolean isValid() {
        return getData()!=null && getData().length>0 
&& getMessage()!=null && !getMessage().equals("");
    }
}

Yukarıda gördüğünüz gibi Message sınıfımızda artık isValid adında bir metodumuz var aynı metodu diğer sınıflarda da kullanacağız. Hem kod tekrarını hemde okunulabilirliği oldukça arttırmış oldu.

Refactoring gerçekten yazılım geliştirmenin olmazsa olmazları arasında. Kodunuzu sürekli gözden geçirip bu tarz yapılar gördüğünüzde bu Refactoring tekniğini uygulamanızda oldukça fayda var aklınızda bulunsun.. …

2 thoughts on “Refactoring – Introduce Parameter Object

  1. ismail eski

    Yazılarınızı büyük bir keyifle okuyorum.
    Çalışmalarınızda başarılar dilerim.
    Bütün bir blog’u bir çırpıda aç kurt misali okuyup gelecek yazılarınızı büyük bir sabırsızlıkla bekliyorum.
    Saygılarımla,

Comments are closed.