3.16.2014

Bridge Tasarımı

Temel motivasyonu arayüz ve uygulamayı birbirinden ayırmaktır.

Dikkat edilirse diagramdan da görülebilir DrawAPI bir ınterface ama Shape sınıfı bunun implemente etmiyor bunun kullanarak genişleme yaratıyor, şu sekilde Interface üzeride implementasyona bazı seyleri dikte etmeden genişleme noktası sağlanabiliniyor.

 

 

public class BridgePatternDemo {

public static void main(String[] args) {

Shape redCircle = new Circle(100,100, 10, new RedCircle());

Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

redCircle.draw();

greenCircle.draw();

}

}

 

public interface DrawAPI {

public void drawCircle(int radius, int x, int y);

}

public class Circle extends Shape {

private int x, y, radius;

public Circle(int x, int y, int radius, DrawAPI drawAPI) {

super(drawAPI);

this.x = x;

this.y = y;

this.radius = radius;

}

public void draw() {

drawAPI.drawCircle(radius,x,y);

}

}

public class GreenCircle implements DrawAPI {

@Override

public void drawCircle(int radius, int x, int y) {

System.out.println("Drawing Circle[ color: green, radius: "

+ radius +", x: " +x+", "+ y +"]");

}

}

public class RedCircle implements DrawAPI {

@Override

public void drawCircle(int radius, int x, int y) {

System.out.println("Drawing Circle[ color: red, radius: "

+ radius +", x: " +x+", "+ y +"]");

}

}

public abstract class Shape {

protected DrawAPI drawAPI;

protected Shape(DrawAPI drawAPI){

this.drawAPI = drawAPI;

}

public abstract void draw();        

}

3.01.2014

Factory Pattern Örneği

FileLogger.java

logu dosyaya yazan sınıf

public class FileLogger implements Logger {

public void log(String message) {

                System.out.println("Logging to file: " + message);

                // logun dosyaya yazılması işlevi

        }

}

DataBaseLogger.java

public class DataBaseLogger implements Logger {

        public void log(String message) {

                System.out.println("Logging to database: " + message);

                //log detayının Db ye yazılması işlevi

        }

}

SMSLogger.java

public class SMSLogger implements Logger {

@Override

public void log(String message) {

System.out.println("Logging to SMS: " + message);

        //log detayının SMS ile iletilmesi işlevi

}

}

Logger.java

Interface sınıfımız, yukarıdaki 3 sınıfımızda bu arayüzü implemente etmek durumunda, yarın xmlLogger, MailLogger veya başka genişleme durumlarında Interface yapımızı kullanılarak eklemeler olabilir.

public interface Logger {

        public void log(String message);

}

LoggerFactory.java

// loglama fabrikamız istenilen loglama nesnesinin sağlanması işlevini görecek.

public class LoggerFactory {

private LoggerFactory() {

}

public static Logger getLogger(LoggerType loggerType) {

Logger logger;

switch (loggerType) {

case DATABASE:

logger = new DataBaseLogger();

break;

case SMS:

logger = new SMSLogger();

break;

default:

logger = new FileLogger();

}

return logger;

}

public enum LoggerType {

DATABASE,

FILE,

SMS;

}

}

şimdi bu yapıyı test edelim alşağıdaki kod Sınıf ile oluşturduğumuz Patteri test ediyor.

public class Application {

        private final Logger logger = (Logger) LoggerFactory.getLogger(LoggerType.SMS);

        private void doSomething() {

                logger.log(" Executing method doSomething()");

                // do something

        }

        public static void main(String[] args) {

                Application application = new Application();

                application.doSomething();

        }

}

 

Özet;

  1. Factory kullanırken bize gerekli olacak nesnelerin implementasyon ile soyutlanmasını sağlar
  2. Bir işlev için grekli olan sınıfların karşamşık yapısını bilmeden kullanabilmemize olanak sağladı.Application içinde LoggerType.SMS diyerek loglamamızı SMS ile ileteceğimizi belirttik, nasıl yaptığını bilmek zorunda değiliz.

Factory Pattern Örneği

FileLogger.java

logu dosyaya yazan sınıf

public class FileLogger implements Logger {

public void log(String message) {

                System.out.println("Logging to file: " + message);

                // logun dosyaya yazılması işlevi

        }

}

DataBaseLogger.java

public class DataBaseLogger implements Logger {

        public void log(String message) {

                System.out.println("Logging to database: " + message);

                //log detayının Db ye yazılması işlevi

        }

}

SMSLogger.java

public class SMSLogger implements Logger {

@Override

public void log(String message) {

System.out.println("Logging to SMS: " + message);

        //log detayının SMS ile iletilmesi işlevi

}

}

Logger.java

Interface sınıfımız, yukarıdaki 3 sınıfımızda bu arayüzü implemente etmek durumunda, yarın xmlLogger, MailLogger veya başka genişleme durumlarında Interface yapımızı kullanılarak eklemeler olabilir.

public interface Logger {

        public void log(String message);

}

LoggerFactory.java

// loglama fabrikamız istenilen loglama nesnesinin sağlanması işlevini görecek.

public class LoggerFactory {

private LoggerFactory() {

}

public static Logger getLogger(LoggerType loggerType) {

Logger logger;

switch (loggerType) {

case DATABASE:

logger = new DataBaseLogger();

break;

case SMS:

logger = new SMSLogger();

break;

default:

logger = new FileLogger();

}

return logger;

}

public enum LoggerType {

DATABASE,

FILE,

SMS;

}

}

şimdi bu yapıyı test edelim alşağıdaki kod Sınıf ile oluşturduğumuz Patteri test ediyor.

public class Application {

        private final Logger logger = (Logger) LoggerFactory.getLogger(LoggerType.SMS);

        private void doSomething() {

                logger.log(" Executing method doSomething()");

                // do something

        }

        public static void main(String[] args) {

                Application application = new Application();

                application.doSomething();

        }

}

PastedGraphic-2014-03-2-00-02.png

Özet;

  1. Factory kullanırken bize gerekli olacak nesnelerin implementasyon ile soyutlanmasını sağlar
  2. Bir işlev için grekli olan sınıfların karmaşık yapısını bilmeden kullanabilmemize olanak sağladı.Application içinde LoggerType.SMS diyerek loglamamızı SMS ile ileteceğimizi belirttik, nasıl yaptığını bilmek zorunda değiliz.

2.02.2014

Kötü Tasarım Belirtileri

1. Rigidity (Esnemezlik)

2. Fragility (Kırılganlık) 

3. Immobility (Taşınamazlık)

4.        Viscosity (Akışkanlık)

Bu dört durum ile ilgili Örnek kodlarımız üzerinden durumu açıklamaya çalışalım biraz.

1. Regidity (Esnemezlik)

class Canli {

 void ortakFonksiyon() {

        System.out.println(“Canli");

    }

 }

 

class Agac extends Canli{

    void ortakFonksiyon() {

        System.out.println(“Agac");

    }

     

    void testFonksiyonu() {

        System.out.println(“Agac");

    }

}

 

public class ClassCastCheck {

    public static void main(String[] args) {

        Agac c = (Agac) new Canli();//Burada hata alınmaz.

         

        c.ortakFonksiyon();

         

        c.testFonksiyonu();//Burada hata alınır mı ?

    }

}  

Buradaki hatayı anlamak çok kolay olmayabilir ve benzer kullanımlar kodun içinden çıkılmaz hale getirerek, ileride daha büyük sorunlara neden olabilir.  Yukarıdaki Kodda ClassCastException hatasını ne zaman ve nerde alabileceğimizi biliyormuyuz? Bu hatayı aldığımızda ne olur sizce?

 

 2. Fragility (Kırılganlık)

class Base{

    protected int x;

    protected void m(){

         x++;

    }

   protected void n(){

      x++; // <- hata

     m();

    }

}

class Sub extends Base{

   protected void m(){

       n();

   }

}

kırılganlık özellikle exted (miras) alınan sınıflar üzerinde karşımıza çıkar. Yukarıdaki örnek için bakarsak eğer, yani aşağıdaki gibi basit bir örnek kod ile Sub sınıfının m metodunu çağırsak ne olur ...

public class TestCode {

 public TestCode() {

     Sub sub = new Sub();

     sub.m();

 }

public static void main(String[] args) {

     TestCode testCode = new TestCode();

   }

}

yukarıdaki kod parçacığı çalıştığında durumu ne olacak dersiniz?  aşağıdaki hatayı alıyor olacaksınız elbette ….

Exception in thread "main" java.lang.StackOverflowError

at com.blog.code.Fragility.Base.n(Base.java:11)

at com.blog.code.Fragility.Sub.m(Sub.java:5)

at com.blog.code.Fragility.Base.n(Base.java:12)

................

 

 

10.07.2012

ensureCriteriaItem() örneği

// get the criteria item from the criteria row

ViewCriteriaItem criteriaItem =

vcRow.ensureCriteriaItem("EmployeeId");

// set the criteria item operator

criteriaItem.setOperator("<");

// set the criteria item value

criteriaItem.getValues().get(0).setValue(new Integer(150));

clearCriteriaValues()

 

public void clearCriteriaVariableValues(

String[] criteriaNames) {

// iterate all view criteria names

for (String criteriaName : criteriaNames) {

// get the view criteria

ViewCriteria vc = this.getViewCriteria(criteriaName);

if (vc != null) {

VariableValueManager vvm = vc.ensureVariableManager();

Variable[] variables = vvm.getVariables();

for (Variable var: variables) {

vvm.setVariableValue(var, null);

}

}

}

}

 

6.02.2012

TreeMap örneği

     

 TreeMap treeMap = new TreeMap();

        treeMap.put(312, "ANKARA");

        treeMap.put(216, "ISTANBUL");

        treeMap.put(232, "IZMIR");

        treeMap.put(428, "TUNCELI");

     

        System.out.println(treeMap);

7.31.2010

Satır Kopyalama

public static Row duplicateRow(ViewObject vo, Row currentRow) {
Row newRow = null;
try {
newRow = vo.createRow();
newRow.setNewRowState(Row.STATUS_NEW);
AttributeDef[] attrs = vo.getAttributeDefs();
for (int i = 0; i < attrs.length; i++) {
if (!attrs[i].isPrimaryKey() && (attrs[i].getUpdateableFlag() == AttributeDef.UPDATEABLE || attrs[i].getUpdateableFlag() == AttributeDef.UPDATEABLE_WHILE_NEW)) {
String attrName = attrs[i].getName();
try {
newRow.setAttribute(attrName, currentRow.getAttribute(attrName));
} catch (Exception e) {

EtiyaLoggerHelper.log(LoggerCategoryNames.PRODUCT, new EtiyaException(e, "1"));
}
}
}
} catch (Exception e) {
EtiyaLoggerHelper.log(LoggerCategoryNames.PRODUCT, new EtiyaException(e, "1"));
}
return newRow;
}