オブジェクトの本質

20028 ワード

Author JYBlog
Email [email protected]
このブログGitHubオープンソース(jcNaruto/JYBlog)、
JYBlogは毎週金曜日、水曜日の公衆番号などのマルチプラットフォームが同時に更新され、討論交流を歓迎します.

#.補足


プロセス向け開発においても構造体などの操作を用いて高集約低結合を実現することができ、開閉原則に従うコードを書くこともでき、抽象的にオブジェクト向けを見ることができ、少し形而上のプログラミング思考に似ている.プログラミングモデルの一つでもある.つまり、動的反復を記述するソフトウェアエンジニアリングにおいてオブジェクト向けのプログラミング思考はエンジニアリングの拡張性、メンテナンス性、さらには作業量を低下させる.上級者はプロセス向けと同様に拡張性を書くことができ、メンテナンス性の良いコード(仕事量は大きくなるが、性能や他の面での収穫をもたらす可能性がある)を使用し、さらに具体的なオブジェクト向け言語にマッピングし、例えばJava言語はオブジェクト向けのプログラミング思考を実現し、開発者がオブジェクト向け思考に接触しやすいようにする.

1.概要


プロセスに向かって問題を解決するステップを関数の中に書いて、コンピュータにステップの順番に問題を解決させて、大型のソフトウェアエンジニアリングの開発の中でこのようなプロセス化は維持の困難をもたらして、ソフトウェアの開発の中で需要の変更はよくある事なため、例えばAB 2人は同時に1つのソフトウェアを開発して、3つの図形を回転して、正方形、三角形、円形、Aはプロセスに向かって開発して、Bは対象に向かって開発します
//A 
rotate(shapeName){
    // 
}
//B 
class Square{
    ....
    public void rotate(){
        // 
    }
}
class Triangle{
    ....
    public void rotate(){
        // 
    }
}
class Round{
    ....
    public void rotate(){
        // 
    }
}

このとき、プロセス向けの優位性がわかります.コード量は少なくなりますが、六角形を追加する必要があります.六角形の回転方法は前の3つと一致しません.
//A 
rotate(shapeName){
    if(hexagon){
        // 
    }else{
       //  
    }
}

プロシージャ向けに、需要が動的に変更されたときにテストされたコードを変更します.つまり、需要が変更されるたびに再テストされ、リソースが消費されます.
例えば、インターネット内の製品の反復は一生を伴っています.例えば、ある製品が今でも反復のために余分なコードをテストすると、プロジェクト全体が異常に肥大化して遅くなります.
//B 
.....
class Hexagon{
     ....
    public void rotate(){
        // 
    }
}

オブジェクトに向かうにはクラスを1つ増やせばいいだけで、このときオブジェクトに向かう優位性が現れ、テストしたコードを修正しなくてもいい.需要は絶えず変更され、変更するたびに新しいクラスをテストするだけでいい.
すなわち,ソフトウェアエンジニアリングの動的反復の過程では,オブジェクト向けの優位性が現れるが,この場合,オブジェクト向けのコード量がプロセス向けよりも高いという問題があり,この問題を解決するためにオブジェクト向けの継承特性を用いることができ,同時にプログラムの結合性を低減し,コードの集約性を向上させるためにオブジェクト向けにパッケージ化し,プログラムの拡張性を向上させた多様性がある.

2.パッケージ(Encapsulation)

class Student{
    public int age;
}

class Teacher{
    
    public void score(){
        Student student = new Student();
 		student.age = -99;//        
    }
}

以上がカプセル化されていない結果であり、実際のビジネス状況から完全に逸脱し、studentのage filedが他のすべてのオブジェクトに露出している場合を解決するために、一般的にはインスタンス変数をprivateとマークし、各filedに一意のpublicのsetter(設定)、getter(取得)メソッドを提供し、他のオブジェクトにfieldの設定または取得時に必ず対応するsetter、getterメソッドを通過させることをお勧めします.また、setterメソッドやgetterメソッドの内部では、ビジネスニーズに応じて論理的に判断することもできます.
class Student{
    private int age;
    
    public void setAge(int age){
    	if(age > 105 || age <0){
            thorw new RuntimeException("age invalid");// set 
    	}
        this.age = age;
    }
    
    public int getAge(){
        return age;
    }
}

class Teacher{
    
    public void score(){
        Student student = new Student();
 		student.setAge(12);     
    }
}

に注意
  • getter、setterメソッドのネーミングには仕様があります(仕様は守ったほうがいい、守らなくてもいいですが、高価な代価を払う可能性があります.ソフトウェアエンジニアリングでは自分ですべての車輪を作る可能性があります)、xxx getPropertyName()、void setPropertyName(xxx propertyName)、filedがbooleanタイプgetメソッドであればboolean isPropertyName()とネーミングします.またgetterメソッドとsetterメソッドを持つfiledを属性と呼ぶことができる.
  • の実際の開発では、setterとgetterメソッドで検証することはめったにないため、getterとsetterを除いて直接filedをpublicに設定することができると提案されています.これは誤った観点です.この2つのメソッドが直接filedの値を返したり設定したりしたとしても、fieldに統一的なアクセスパスを提供しています.ある日、新しい需要があるパラメータを検証し、setterメソッドで直接設定すればよいので、しかし、filedのpublic属性を直接外暴すれば、無数のxxx.フィールドは検証が難しい.すなわちgetter,setter法はプログラムの集約性を向上させモジュールの結合性を低下させ,検証論理がなくても加算する.1つのclassのすべての属性がsetter,getterメソッドに対応している場合、classはJava beanと呼ばれ、データの転送に多く使用されます.
  • 一般的に敏感なデータまたは外部が感知する必要のない複雑な論理方法もprivateパッケージを使用して結合度を低減し、使用コストを低減しなければならない.

  • 3.継承(Inheritance)


    以前にグラフィック回転を開発した例に戻ると、複数のクラスに重複するrotateメソッドがあり、その場合は1つの親を抽出することができ、親クラスにはそのrotateメソッドがあり、子クラスはextendsで親を継承し、そのrotateメソッドを持つことができるが、六角形の回転方式が異なり、@Overrideで独自のrotateメソッドを再実現することができる.
    注意:
  • 継承は表面的にはコード多重化技術によりモジュールに多重性を持たせるとともに、子親クラス間で何らかのプロトコルを構築しているが、一般クラス継承と抽象クラス継承とinterface implementsを組み合わせて使用され、規範性、多重性の強いクラスアーキテクチャを設計するために使用できる.
  • 今後,抽出されたコードを変更する場合は,ここを変更するだけでよいし,親クラスを再コンパイルするだけでよい.
  • java単一継承は,多重継承の致命的なブロック問題を回避するため,インタフェースを用いて単一継承の不足を補う.
  • superは親を表し、super.filedNameは親filedにアクセスし、super()は親構築メソッドを呼び出すために、どのクラスの構築メソッドの最初の行もこれであり、コンパイラがなければ自動的に追加されます.
  • 継承には、子クラスが親クラスのprivateフィールドまたはメソッドにアクセスできないことに制限があり、protectedに変更して、子クラスまたは子クラスにアクセスできるようにします.
  • ObjectはJavaの総親であり、万事万物の抽象である.
  • は組合せと継承を区別し,組合せは参照タイプ変数をfield,is用継承,has用組合せとし,is関係を満たすか否かを李氏置換原則により判断し,どの親が現れる場所にも対応する子クラスが出現し,コンパイル運転に成功した.
  • final修飾classと修飾方法が継承に与える影響.
  • は、子クラスを上へ親クラスに変換することができ、上への変換と呼ばれ、親クラスを子クラスに変換することもできますが、子クラス拡張の方法は親クラスにはないため、下への変換時にinstanceofで演算子の左のインスタンスが右のタイプであるか、右の子クラス
    class Person{
        public int age;
        public String name;
        
        public void say(){
            System.out.println(age + "=====" + name);
        }
    }
    
    class Student extends Person{
        public int score;
        
        @Override
        public void say(){
            System.out.println(age + "=====" + name + "=======" + score);
        }
    }
    
    public class InheritTest {
    	public static void main(String[] args){
            Person upStudent = new Student();// ,ok
            Student downStudent1 = new Person();// ,ClassCastException
            
            if(upStudent instanceof Student){//instanceof  ,    
                Student downStudent2 = (Student)upStudent;// 
            }
            
            // Person Student say 
            upStudent.say();
            // Student , 
    	}
    }
    
    に継承されているかを判断する使用コストは非常に低いが、これは負の問題をもたらし、継承を乱用し、方法汚染と方法爆発が発生し、方法汚染は親が備える機能が子類に伝わることを指すが、子類はこの機能を備えていない.方法爆発はある子類の方法が多すぎて、コードの作成と調式に適していないことを指す.そのため、継承を慎重に使用し、
  • の濫用を避ける.

    4.多態(Polymorphic)


    サブクラスがアップコンバートされた後、サブクラスは対応するメソッドも上書きされ、このとき呼び出されるのはサブクラスのメソッドであるが、変数の識別子は確かに親クラスタイプであるため、Javaのインスタンスメソッド呼び出しは、宣言された変数タイプではなく、実行時の実際のタイプに基づく動的呼び出しであり、これがマルチステートであると結論した.その意味は,実行期間が動的に呼び出される子クラスのメソッドか親クラスのメソッドかを決定することである.
    マルチステートの強力な機能により、親コードとビジネスロジックコードを変更せずに、サブクラスを拡張することで機能の拡張を実現できます.
    くりを一つあげる
    異なる学院の保研ランキングの計算方式は一致せず、各学院には各学院のアルゴリズムがある.
    class Push{
        public int[] scores;
        
        public void getFinalScore(){
            System.out.println(scores*0.1 + scores*0.4 + scores*0.5);
        }
    }
    
    class MathStudent extends Push{
        @Override
         public void getFinalScore(){
            System.out.println(scores*0.9 + scores*0 + scores*0.1);
        }
    }
    
    class CSStudent extends Push{
        @Override
         public void getFinalScore(){
            System.out.println(scores*0.3 + scores*0.4 + scores*0.3);
        }
    }
    
    public class Caculator{
        public void getFinalScores(Push[] pushs){
            for(Push push : pushs){// ,getFinalScores Push , , getFinalScore , , 
    			push.getFinalScore();
            }
        }
    }
    

    同様のinterfaceと実装クラスの間でもマルチステートを実装できる
    マルチステートにより、モジュールは多重化に基づいてより拡張性が向上
    注意:リロードとマルチステートには何の関係もありません.リロードはメソッドを上書きしていません.また、リロードはコンパイル時に呼び出すメソッドを決定することができます.ダイナミックとは言えません.

    5.まとめ


    オブジェクト向け三大プロパティ
  • パッケージは、プログラムの集約を向上させ、結合を低減し、プログラムのメンテナンス使用コストを低減する.
  • は、モジュール間で多重化され、コードを少なく書くことができるように継承され、マルチステートの基礎であり、同時に子親クラス間でプロトコルが生成される.
  • マルチステートにより、モジュールは多重化に基づいてより拡張性が向上します.

  • 6.オブジェクト向けと抽象

  • オブジェクト向けは、オブジェクトを通じて現実世界をコンピュータモデルにマッピングするプログラミング方法であり、抽象的な思考の体現である.
  • 抽象はコンピュータ科学における重要な思考である.

  • 2.1詳細を捨て、既存のapiを直接使用する(命令セットはCPUの抽象であり、プログラミング時にCPUの下層の集積回路の詳細を理解する必要はなく、命令セットを直接使用すればよく、コンピュータの使用コストを大幅に削減する).
    2.2対象に向かう抽象は帰納演繹に分けられ、帰納:具体から本質、個性から共性、演繹:本質から具体、共性から個性まで.

    7.お礼

  • コード高効率Java開発マニュアル楊冠宝(孤尽)高海慧(鳴莎)
  • HeadFirst Java Bert Bates Kathy Sierra