Eclipse: opcje, które ułatwiają pracę z kodem – część II / Eclipse: options that make coding easier – part II

Cześć! Dziś druga część wskazówek, ułatwiających pracę z kodem w środowisku Eclipse. W poprzedniej części pokazałam opcje przydatne przy tworzeniu nowych klas: generowanie getterów i setterów, metod hashCode() i equals() oraz metody toString(). W tej części zaprezentuję Wam opcje, których korzystamy w momencie, gdy chcemy coś zmienić w już istniejącym kodzie.

***

Hi! Today second part of hints, that make coding in Eclipse easier . In the previous part, I have showed options useful when you create new class: generating getters and setters, hashCode() and equals() methods and toString() method. In this part, I will show you the options, that we use when we want to change something in already existing code.

For English please scroll down.

Extract Constant – “wyodrębnianie” stałej

Załóżmy, że potrzebujemy warunku sprawdzającego czy długość łańcucha znaków nie przekracza wartości 20. Jest nam to potrzebne, ponieważ pole color w tabeli cars ma właśnie ograniczanie do 20 znaków. Jednak o wiele czytelniejsze (i łatwiejsze do utrzymywania) byłoby w tym miejscu użycie stałej o znaczącej nazwie zamiast wpisanej na sztywno wartości.

 public void setColor(String color) throws InvalidLenghtException {
      if (color.length() <= 20) {
          this.color = color;
      } else {
          throw new InvalidLenghtException("color");
     }  
 }

Aby w miejscu “20” pojawiła się stała, możemy użyć opcji “Refactor -> Extract Constant…”constance_1.pngNastępnie wpisujemy nazwę stałej:constance_2I zamiast mało mówiącej liczby 20, mamy stałą MAX_LENGTH_20.

private static final int MAX_LENGTH_20 = 20;

public void setColor(String color) throws InvalidLenghtException {
     if (color.length() <= MAX_LENGTH_20) {
         this.color = color;
     } else {
         throw new InvalidLenghtException("color");
     }
 }

Rename – zmiana nazwy

A co jeśli chcemy zmienić nazwę zmiennej? Przypuśćmy, że zamiast pola make, chcemy mieć pole brand. Oba słowa oznaczają markę samochodu.

public class Car {

 private int id;
 private String make;
 private String model;
 private int year;

}

Używamy wtedy opcji “Refactor -> Rename”refactor_1.pngI wpisujemy nową nazwę:refactor_2.png

Zmieniona zostanie nie tylko deklaracja pola, ale także wszystkie jego wystąpienia:

 public class Car {

 private int id;
 private String brand;
 private String model;
 ...

 public String getMake() {
   return brand;
 }

 public void setMake(String make) throws InvalidLenghtException {
    if (make.length() <= MAX_LENGTH_20) {
        this.brand = make;
    } else {
        throw new InvalidLenghtException("make");
    }
 } 
}

Użycie tej opcji gwarantuje nam, że nie przeoczymy żadnego wystąpienia tej zmiennej. Jest też bardzo wygodne w przypadku zmiany nazwy klasy, ponieważ zmieniana jest równocześnie nazwa pliku, w którym się ona znajduje.

Change method signature – zmiana sygnatury metody

Nie do końca podoba nam się, że teraz metoda getMake() zwraca pole brand. Wprowadza to w błąd i narusza reguły nazewnictwa getterów. Z pomocą przychodzi nam opcja “Refactor -> Change Method Signature”:method_signature1.pngWpisujemy nową nazwę metody:method_signature2.pngWarto zaznaczyć, że możemy zmienić nie tylko nazwę, ale i rodzaj zwracanej wartości oraz parametry metody. Po wybraniu opcji “Preview”, widzimy, w których plikach występuje przetwarzana metoda i jak zostanie zmieniona.method_signature3.pngTak jak w przypadku zmiany nazwy za pomocą “Refector -> Rename”, używając opcji “Change Method Signature” mamy pewność, że nie umknie nam żadne wystąpienie metody “getMake()”. Co więcej, gdy zmieniamy parametry lub zwracany typ możemy ocenić, czy metoda w nowej postaci nie będzie powodowała błędów w innych klasach, zanim wprowadzimy zmiany do kodu.

 ***

Extract Constant – “wyodrębnianie” stałej

Let’s assume we need a condition, that check if string’s length is not greater than 20. We need this, because color field in cars table has constraint to 20 signs. However, more readable (and easier to maintain in future) would be using a constant with meaningful name instead of hard coded value.

 public void setColor(String color) throws InvalidLenghtException {
      if (color.length() <= 20) {
          this.color = color;
      } else {
          throw new InvalidLenghtException("color");
     }  
 }

In order to have a constant in place of  “20”, we can use option “Refactor -> Extract Constant…”constance_1.pngThen we type constant’s name:constance_2And in place of number 20 that tell us nothing, we have the constant MAX_LENGTH_20.

private static final int MAX_LENGTH_20 = 20;

public void setColor(String color) throws InvalidLenghtException {
     if (color.length() <= MAX_LENGTH_20) {
         this.color = color;
     } else {
         throw new InvalidLenghtException("color");
     }
 }

Rename

And what if we want to change a variable’s name? Let’s assume, instead of field: make, we want field: brand. Both refer to the car type.

public class Car {

 private int id;
 private String make;
 private String model;
 private int year;

}

We use option: “Refactor -> Rename”refactor_1.pngAnd type the new name:refactor_2.pngNo only the field declaration has been changed, but also all its occurences in the code:

 public class Car {

 private int id;
 private String brand;
 private String model;
 ...

 public String getMake() {
   return brand;
 }

 public void setMake(String make) throws InvalidLenghtException {
    if (make.length() <= MAX_LENGTH_20) {
        this.brand = make;
    } else {
        throw new InvalidLenghtException("make");
    }
 } 
}

Using this option guarantees us, that we wouldn’t overlook any of variable’s occurences. It is also very convenient for changing class name, as the class file name will be changed at the same time.

Change Method Signature

But we do not like, that now getMake() method returns brand. It is misleading and violates getters naming rules.  Helpful is option:”Refactor -> Change Method Signature”:method_signature1.pngWe type new method’s name:method_signature2.pngAs you can seen, we can not only change a name, but also a return type and parameters of the method. After choosing option “Preview”, we see in which files processed method occurs and how would it change.method_signature3.pngLike in case option “Refector -> Rename”, when we use “Change Method Signature” we are sure that, no occurence of  “getMake()” method would be overlooked. What’s more, when we are changing method’s parameters or return value we can analyse if method with new signature won’t cause any conflicts in another classes before we apply our changes.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s