Вопрос шаблона Java - построитель или код БД в модели? - PullRequest
1 голос
/ 23 сентября 2010

Мне нужно построить 'MyThingie', используя 'A'.MyThingie находится в пакете модели, и в настоящее время никакой код в модели не обращается к БД.У меня вопрос, какой из следующих шаблонов я должен использовать?Верх или низ?Или что-то совершенно другое.

package com.model;

public class MyThingie {
    private String foo = "";
    private String bar = "";
    private X x = null;
    private Y y = null;
    private Z z = null;

    public MyThingie() {
    }

    public MyThingie(A a, X x, Y y, Z z) {
        this.foo = a.getFoo();
        this.bar = a.getBar();
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public static MyThingie createFromDb(A a) { 
        X x = fetchXFromDB(a.getBlah()); 
        Y y = fetchYFromDB(a.getFlah()); 
        Z z = fetchZFromDb(a.getZlah()); 

        return new MyThingie(a, x, y, z); 
    }

    // getters and setters
}

// ----------- OR----------------

package com.model;

public class MyThingie {
    private String foo = "";
    private String bar = "";
    private X x = null;
    private Y y = null;
    private Z z = null;

    public MyThingie() {
    }

    // getters and setters
}

package com.builder;

public class MyThingieBuilder {
    public MyThingieBuilder() {
    }

    public static MyThingie createFromDb(A a) { 
        MyThingie m = new MyThingie();

        m.setFoo(a.getFoo());
        m.setBar(a.getBar());

        X x = fetchXFromDB(a.getBlah()); 
        Y y = fetchYFromDB(a.getFlah()); 
        Z z = fetchZFromDb(a.getZlah()); 

        m.setX(x);
        m.setY(y);
        m.setZ(z);

        return m;
    }
}

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Оба решения в порядке. Но есть методология / шаблон «строителя», который может оказаться полезным.

После моего опубликованного комментария я представляю пример Строителя как внутренний класс

Widget x = new Widget.Builder("1", 1.0).
                 model("1").build();
Widget y = new Widget.Builder("2", 2.0).
                 model("2").manufacturer("222").
                 serialNumber("12345").build();
Widget z = new Widget.Builder("3", 4.0).  
                 manufacturer("333").
                 serialNumber("54321").build();

Основная идея шаблона состоит в том, чтобы ограничить количество параметров конструктора и избежать использования методов установки. Конструкторы со слишком большим количеством параметров, особенно необязательных, уродливы и сложны в использовании. Несколько конструкторов для разных режимов сбивают с толку. Методы установки добавляют беспорядок и заставляют объект быть изменчивым. Вот класс скелета по шаблону -

public class Widget {
 public static class Builder {
 public Builder(String name, double price) { ... }
 public Widget build() { ... }
 public Builder manufacturer(String value) { ... }
 public Builder serialNumber(String value) { ... }
 public Builder model(String value) { ... }
}

private Widget(Builder builder) { ... }

}

0 голосов
/ 23 сентября 2010

Не разбрызгивайте логику доступа к данным в ваших моделях. Вместо этого рассмотрите возможность использования шаблона DAO. Позвольте вашему бизнес-объекту (обычно классу обслуживания) использовать этот объект DAO для получения или изменения вашей модели. Взгляните на этот Образец .

...