トビーのスプリング-1枚対象と依存関係(1)


**『トビーのスプリング3.1-Vol.1スプリング理解と原理』という本をもとに学習した内容.

1.1秒気まずいDAO


DAO(Data Access Object)
DBを使用してデータをクエリーまたは操作するオブジェクトに特化しています.

1.1.1 User

  • ユーザ情報を格納するユーザクラス(Property:id,name,password)
    ->javabeanの約束に従うオブジェクト
    JavaBean
    :元のビジュアルツールで操作できる構成部品
    -ポーリング作成者:javabeanにはパラメータなしのポーリング作成者が必要です
    -Property:javabeanで公開されている名前のプロパティ、Propertyでsetで始まるモディファイヤメソッド(setter)、getで始まるアクセス者メソッド(getter)を使用して変更および参照
  • public class User{
        String id;
        String name;
        String password;
        
        public String getId(){
        	return id;
        }
        public void setId(String id){
        	this.id = id;
        }
        public String getName(){
        	return name;
        }
        public void setName(String Name){
        	this.name = name;
        }
        public String getPassword(){
        	return password;
        }
        public void setPassword(String password){
        	this.password = password;
        }
    }
  • DBにUSERSテーブル
  • を作成する
    create table users(
        id varchar(10) primary key;
        name varchar(20) not null;
        password varchar(20) not null;
    )
    

    1.1.2 UserDao

  • JDBC登録とクエリー機能を持つUserDaoクラス
    -add:新しいユーザーを作成する方法
    -get:アイデンティティを使用してユーザー情報を読み出す方法
  • です.
    public class UserDao {
    	public void add(User user) throws ClassNotFoundException, SQLException {
    		Class.forName("com.mysql.jdbc.Driver");
            	Connection c = DriverManager.getConnection(
            		"jdbc:mysql://localhost/springbook", "spring", "book");
                
            	PreparedStatement ps = c.prepareStatement(
            		"insert into users(id,name,password) values(?,?,?)");
            	ps.setString(1, user.getId());
            	ps.setString(2, user.getName());
            	ps.setString(3, user.getPassword());
            
            	ps.executeUpdate();
            
            	ps.close();
            	c.close();
          }
          
          	public User get(String id) throws ClassNotFoundException, SQLException {
    		Class.forName("com.mysql.jdbc.Driver");
            	Connection c = DriverManager.getConnection(
            		"jdbc:mysql://localhost/springbook", "spring", "book");
                
            	PreparedStatement ps = c.prepareStatement(
            		"select * from users where id=?");
            	ps.setString(1, id);
            
            	ResultSet rs = ps.executeQuery();
                	rs.next();
                	User user = new User();
                	user.setId(rs.getString("id"));
                	user.setName(rs.getString("name"));
                	user.setPassword(rs.getString("password"));
                
            	
                	rs.close();
            	ps.close();
            	c.close();
                
                return user;
          }
    }
            

    1.2分離DAO


    1.2.1注目点の分離


    開発者がオブジェクトを設計する際に最も考慮しなければならない事項は、将来の変化にどのように対応するかです.プログラミングの基礎概念の一つは注目点の分離である.これをオブジェクト向けに適用すると、同じ興味のあるものが1つのオブジェクト内または親密なオブジェクトに集まり、異なる興味のあるものができるだけ分離され、相互影響を避けることができます.

    1.2.2コネクタの抽出の作成


    上述したUserDaoのAdd()メソッドでは,3つの主要な注目点が見られる.
    1.データベース接続
    2.ユーザー登録のためにデータベースに送信するSQL文を含むステータスの作成と実行
    3.使用済みリソースのステータスと接続オブジェクトを閉じる
    上記実装のUserDaoにDB接続をインポートするコードは,add()メソッドに含まれる他の注目点と混在する.またadd()メソッドにインポートされたDB接続のコードがget()メソッドのコードと重複するのは問題である.

    重複コードの抽出方法


    重複するDB接続コードをgetConnection()という独立したメソッドとして作成します.DB接続に関連する部分が変更された場合、getConnection()メソッドのコードを変更するだけで、興味は他のメソッドに影響しません.
  • getConnection()メソッドを抽出して、重複するUserDao
  • を除去
    public void add(User user) throws ClassNotFoundException, SQLException {
    	Connection c = getConnection();
        	...
    }
    
    public User get(String id) throws ClassNotFoundException, SQLException {
    	Connection c = getConnection();
        	...
    }
    
    private Connection getConnection() throws ClassNotFoundException, SQLException {
    	Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection(
            	"jdbc:mysql://localhost/springbook", "spring", "book");
            return c;
    }

    リファクタリング


    改造する
    外部動作の操作やスキルを変更することなく、内部構造を変更して既存のコードを再構築します.
    再設計は、コードの内部設計を改善し、コードをより理解しやすくし、変化に効果的に対応させることができます.(作業効率の向上、コード品質の向上、メンテナンスの容易化)
    前の例に示すように、共通の機能を担う方法を用いて重複するコードを抽出することを、再構成において方法抽出(extract method)技術と呼ぶ.

    1.2.3 DB接続の作成とは独立


    継承による拡張


    上記のコードを複数のユーザーに提供する必要があり、userDaoのソースコードを直接お客様に提供したくない場合.
    UserDaoからメソッドの実装コードを削除し、geConnection()を抽象メソッドとして作成します.
    抽象クラスUserDaoを提供するユーザは、各UserDaoクラスを継承し、それぞれNUserDao、DUserDaoなどのサブクラスを作成することができる.

    ユーザデータ
  • は、継承によって拡張することができる
     public abstract class UserDao{
     	public void add(User user) throws ClassNotFoundException, SQLException {
    		Connection c = getConnection();
        		...
    	}
    
    	public User get(String id) throws ClassNotFoundException, SQLException {
    		Connection c = getConnection();
    		...
        	}
            public abstract Connection getConnection() throws ClassNotFoundException, SQLException; 
    }
    
    public class NUserDao extends UserDao {
    	public Connection getConnection() throws ClassNotFoundException, SQLException{
        	//N사 DB 커넥션 생성 코드
        	}
    }
    
    public class DUserDao extends UserDao {
    	public Connection getConnection() throws ClassNotFoundException, SQLException{
        	//D사 DB 커넥션 생성 코드
        	}
    }

    デザインモード


    ソフトウェア設計における一般的な問題を解決するために、再利用可能なソリューション
    テンプレートメソッドアレイ
    スーパークラス機能を拡張する際に使用される最も代表的な方法を継承します.
    不変の機能はスーパークラスで作成され、常に変更され、拡張する機能はサブクラスで作成されます.
    ファクトリメソッドモード
    サブクラスでは、オブジェクトの作成方法とクラスを決定するために予め定義された方法をファクトリメソッドと呼び、この方法でオブジェクトの作成方法を残りの論理、すなわちスーパークラスの基本コードから独立した方法をメソッドモードと呼ぶ.