Merhabalar, bu konumda kod yazarken nasıl daha temiz / okunabilir ve object oriented kod yazılır ondan bahsedeceğim.
Böyle bir konu açmamın başlıca sebebi, paylaşılan konularda ve sorulan sorularda verilen kodlar fazlasıyla makarna. Okunması ve bakımı yapılması zor kodlar. He birde kesinlikle object oriented değil..
Bu konumda daha temiz kod yazmak için if / else yapılarını daha etkili kullanmayı göstereceğim.
İlk örneğimiz için farz edelim ki birden fazla iç içe if else yapımız var :
Bu kod okuma ve bakım açısından çirkin bir kod. Şimdi bu kodu biraz refactor edelim :
Artık biraz daha okunabilir ve ne yaptığı belli şekle geldi.
Diyelim ki birden fazla durumu kontrol edip aynı işlemi/sonucu döndüren kontrolleriniz var :
Bu kontrolleri tek kontrol altında birleştirin :
Şimdi de en önemli örneğimize geldik. Tip kontrolü yaparak conditional işlemler gerçekleştiriyorsanız bunları polymorphism ile değiştirin.
Farz edelim ki şöyle bir conditional kodumuz var :
Burada tip kontrolünü yaptığımız değerler için önce bir base sınıf oluşturup bu değerlere ait alt sınıflar oluşturalım.
yukarıdaki şekilde kodumuz object oriented hale geldi ve hem kod kalitesi hemde okunabilirliği arttırdık.
Konuyu okuyan arkadaşlar bundan sonra kodlarını daha object oriented ve temiz yazmaya özen gösterirler sanıyorum ki...
Herkese iyi forumlar, ihan3t.
Böyle bir konu açmamın başlıca sebebi, paylaşılan konularda ve sorulan sorularda verilen kodlar fazlasıyla makarna. Okunması ve bakımı yapılması zor kodlar. He birde kesinlikle object oriented değil..
Bu konumda daha temiz kod yazmak için if / else yapılarını daha etkili kullanmayı göstereceğim.
İlk örneğimiz için farz edelim ki birden fazla iç içe if else yapımız var :
Kod:
public double getPayAmount() {
double result;
if (isDead){
result = deadAmount();
}
else {
if (isSeparated){
result = separatedAmount();
}
else {
if (isRetired){
result = retiredAmount();
}
else{
result = normalPayAmount();
}
}
}
return result;
}
Bu kod okuma ve bakım açısından çirkin bir kod. Şimdi bu kodu biraz refactor edelim :
Kod:
public double getPayAmount() {
if (isDead){
return deadAmount();
}
if (isSeparated){
return separatedAmount();
}
if (isRetired){
return retiredAmount();
}
return normalPayAmount();
}
Artık biraz daha okunabilir ve ne yaptığı belli şekle geldi.
Diyelim ki birden fazla durumu kontrol edip aynı işlemi/sonucu döndüren kontrolleriniz var :
Kod:
double disabilityAmount() {
if (seniority < 2) {
return 0;
}
if (monthsDisabled > 12) {
return 0;
}
if (isPartTime) {
return 0;
}
// compute the disability amount
//...
}
Bu kontrolleri tek kontrol altında birleştirin :
Kod:
double disabilityAmount() {
if (isNotEligableForDisability()) {
return 0;
}
// compute the disability amount
//...
}
Şimdi de en önemli örneğimize geldik. Tip kontrolü yaparak conditional işlemler gerçekleştiriyorsanız bunları polymorphism ile değiştirin.
Farz edelim ki şöyle bir conditional kodumuz var :
Kod:
class Bird {
//...
double getSpeed() {
switch (type) {
case EUROPEAN:
return getBaseSpeed();
case AFRICAN:
return getBaseSpeed() - getLoadFactor() * numberOfCoconuts;
case NORWEGIAN_BLUE:
return (isNailed) ? 0 : getBaseSpeed(voltage);
}
throw new RuntimeException("Should be unreachable");
}
}
Burada tip kontrolünü yaptığımız değerler için önce bir base sınıf oluşturup bu değerlere ait alt sınıflar oluşturalım.
Kod:
abstract class Bird {
//...
abstract double getSpeed();
}
class European extends Bird {
double getSpeed() {
return getBaseSpeed();
}
}
class African extends Bird {
double getSpeed() {
return getBaseSpeed() - getLoadFactor() * numberOfCoconuts;
}
}
class NorwegianBlue extends Bird {
double getSpeed() {
return (isNailed) ? 0 : getBaseSpeed(voltage);
}
}
// Somewhere in client code
speed = bird.getSpeed();
yukarıdaki şekilde kodumuz object oriented hale geldi ve hem kod kalitesi hemde okunabilirliği arttırdık.
Konuyu okuyan arkadaşlar bundan sonra kodlarını daha object oriented ve temiz yazmaya özen gösterirler sanıyorum ki...
Herkese iyi forumlar, ihan3t.


