2

私はショップの顧客管理を処理するJavaSwingアプリケーションに取り組んでいます。私はMVCパターンに基づいて構築しようとしていますが、実際には多少経験がありません。

基本的に、顧客作成用のいくつかのテキストフィールドと、もちろん顧客と呼ばれるクラスを含むビューがあります。フォームが送信されると、Customerのオブジェクトが作成され、データベースに保存されます。さて、私の問題は、JTableにすべての顧客を表示するビューを設定することでした。実際には、ビュー自体が問題ではなく、新しい顧客が追加されたとき、または顧客が変更されたときにビューを更新することが問題でした。そのため、すべての顧客を含む配列リストを持つ「Customers」という新しいクラスを作成し、顧客が作成されるたびに、この配列リストに追加されました。

アプリケーションのメインフレームが起動すると、「Customers」のオブジェクトが作成され、データベースからすべての顧客を取得して、jtableの配列リストに追加しました。jtableは、リスナーとして顧客のオブジェクトに追加され、CustomerListenerと呼ばれるインターフェースが実装されました。これにより、顧客の配列リストが変更されるたびに新しいモデルが設定されました。

さて、今は私の問題が何であるかを説明するのに本当に問題がありますが、基本的にこのクラス「customers」は冗長だと思ったので、arraylistなどを「通常の」「Customer」クラスに追加しました。

package v1a;

import java.sql.ResultSet;
import java.util.ArrayList;

public class Customer {

    public static final String KUNDENNUMMER = "Kundennummer";
    public static final String ANREDE = "Anrede";
    public static final String NACHNAME = "Nachname";
    public static final String VORNAME = "Vorname";
    public static final String PLZ = "PLZ";
    public static final String ORT = "Ort";
    public static final String STRASSE = "Strasse";
    public static final String LAND = "Land";
    public static final String TELEFON = "Telefon";
    public static final String MOBIL = "Mobil";
    public static final String EMAIL = "Email";

    public static final String[] CUSTOMER_FIELDS = { KUNDENNUMMER, ANREDE, NACHNAME, VORNAME, PLZ, ORT, STRASSE, LAND, TELEFON, MOBIL, EMAIL };

    private String kn, anrede, nachname, vorname, plz, ort, strasse, land, telefon, mobil = "", email = "";

    private ArrayList<Customer> customers = new ArrayList<Customer>();
    private ArrayList<ICustomerModelListener> listeners = new ArrayList<ICustomerModelListener>();

    public Customer() {
        getAllFromDatabase();
    }   

    public Customer(String[] str) {
        this.kn = str[0];
        this.anrede = str[1];
        this.nachname = str[2];
        this.vorname = str[3];
        this.plz = str[4];
        this.ort = str[5];
        this.strasse = str[6];
        this.land = str[7];
        this.telefon = str[8];
        this.mobil = str[9];
        this.email = str[10];
    }

    public void getAllFromDatabase(){
        SQL.getInstance();
        ArrayList<Customer> arrlist = new ArrayList<Customer>();    
        ResultSet rs = SQL.select("SELECT kundennummer, anrede, name, vorname, strasse, plz, ort, land, telefon, mobil, email FROM kunden");
        try {
            while(rs.next()){
                String[] values = new String[Customer.CUSTOMER_FIELDS.length];
                values[0] = String.valueOf(rs.getInt("kundennummer"));
                values[1] = rs.getString("anrede");
                values[2] = rs.getString("name");
                values[3] = rs.getString("vorname");
                values[4] = rs.getString("strasse");
                values[5] = String.valueOf(rs.getInt("plz"));
                values[6] = rs.getString("ort");
                values[7] = rs.getString("land");
                values[8] = rs.getString("telefon");
                values[9] = rs.getString("mobil");
                values[10] = rs.getString("email");
                Customer c = new Customer(values);
                arrlist.add(c);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }  
        SQL.cleanup();
        this.customers = arrlist;
        for(ICustomerModelListener l : listeners){
            l.CustomerChanged();
        }
    }

    public ArrayList<Customer> getAll(){
        return customers;
    }

    public void addCustomer(Customer customer){
        customers.add(customer);
        for(ICustomerModelListener l : listeners){
            l.CustomerChanged();
        }
    }

    public void addListener(ICustomerModelListener listener){
        listeners.add(listener);
    }

    public static boolean knExists(int kn){
        boolean bool = false;
        SQL.getInstance();
        ResultSet rs = SQL.select("SELECT kundennummer FROM kunden WHERE kundennummer = "+kn);
        try {
            while(rs.next()){
                bool = true;
            }
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
        SQL.cleanup();
        return bool;
    }

    public static int getFreeKn(){
        SQL.getInstance();
        ResultSet rs = SQL.select("SELECT kundennummer FROM kunden ORDER BY kundennummer DESC LIMIT 1");
        int kn = 0;
        try {
            while(rs.next()){
                kn = rs.getInt("kundennummer");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }  
        kn++;
        SQL.cleanup();
        return kn;
    }

     public static Customer getByKn(int kn){
        if(knExists(kn)){
            SQL.getInstance();
            ResultSet rs = SQL.select("SELECT * FROM kunden WHERE kundennummer = "+kn);

            String[] values = new String[CUSTOMER_FIELDS.length];
            try {
                while(rs.next()){
                    values[0] = String.valueOf(rs.getInt("kundennummer"));
                    values[1] = rs.getString("anrede");
                    values[2] = rs.getString("name");
                    values[3] = rs.getString("vorname");
                    values[4] = String.valueOf(rs.getInt("plz"));
                    values[5] = rs.getString("ort");
                    values[6] = rs.getString("strasse");
                    values[7] = rs.getString("land");
                    values[8] = rs.getString("telefon");
                    values[9] = rs.getString("mobil");
                    values[10] = rs.getString("email");
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }  
            Customer customer = new Customer(values);
            SQL.cleanup();
            return customer;
        } else {
            return null;
        }
    }

     public boolean save() {
        SQL.getInstance();
        boolean bool = SQL.saveUser(this.kn, this.anrede, this.nachname, this.vorname, this.plz, this.ort, this.strasse, this.land, this.telefon, this.mobil, this.email);
        SQL.cleanup();
        return bool;
    }

     public String getValue(String s){
        switch (s){
        case KUNDENNUMMER:
            return this.kn;
        case ANREDE:
            return this.anrede;
        case NACHNAME:
            return this.nachname;
        case VORNAME:
            return this.vorname;
        case PLZ:
            return this.plz;
        case ORT:
            return this.ort;
        case STRASSE:
            return this.strasse;
        case LAND:
            return this.land;
        case TELEFON:
            return this.telefon;
        case MOBIL:
            return this.mobil;
        case EMAIL:
            return this.email;
        default :
            return "";
        }
    }
}

今私の質問に:これはMVCパターンに関してそのようなクラスをモデル化する正しい方法ですか?おそらく、私の最初のアプローチは「よりクリーン」でした。なぜなら、すべての顧客が含まれる「コンテナ」や「実際の」顧客クラスのようなものがあったからです。

4

2 に答える 2

4

現在のアプローチは私を怒らせるでしょう。2つの完全に異なる動作を持つCustomerクラスがあります。

  • デフォルトのコンストラクターを使用する場合、実際にはデータベース全体のコンテンツをメモリに格納しています(少なくともcustomerテーブルのコンテンツ)。したがって、この場合、Customerインスタンスは実際には顧客のリスト全体を表します
  • パラメータでコンストラクタを使用する場合、Customerオブジェクトは1つを表すようになりましたCustomer

つまり、コード内でインスタンスに遭遇したときはいつでも、Customerまったく何も知りません。

さらに、データベース全体をメモリに保存するのは少しやり過ぎかもしれません(ただし、限られた数の顧客に対してはおそらく実行可能です)。ただし、より多くのテーブルにこのアプローチを使用する場合は、すぐにメモリ不足になります。実際に必要なデータのみを取得することを検討してください(たとえばJTable、特定の数の顧客のみが同時に表示されるため、すべてを取得する必要はありません)。

そして、それらはビジネスロジックとデータベースロジックを混合する問題です。Customerクラスを実際のデータベースアクセスから明確に分離することをお勧めします。将来データベースを切り替える(またはデータベースとは異なるものを選択する)ことは決してわかりません。その時点でアプリケーション全体を書き直すのではなく、データアクセス層だけを書き直す必要があります。

于 2012-08-27T16:23:33.277 に答える
3

いいえ、お客様にはデータベースコードを含めないでくださいArrayList<Customer>。また、他のクラスで処理する必要があるため、データベースコードを含めないでください。それは純粋である必要があり、顧客の本質を単純にカプセル化する必要があります。それだけです。

さらにリファクタリングして細分化する必要があります。

于 2012-08-27T16:20:53.037 に答える