2

私はカプセル化について何度も読んでいますが、いつもこのようなコードを目にします。これはカプセル化ですか?

class create_active_parent{



function __construct(){
     //something
}


function clean_queues_redis(){
    //creating in this way an object, and using it, is not encapsulation, is it?
    $redis = RedisDB::fetch_instance();        
    $redis->db->flushdb();  
}
4

2 に答える 2

3

カプセル化とは、プライベートフィールドを外部から隠すことです。$redisは単なるローカル変数clean_queues_redisであり、メソッド実行の最後に終了します。

于 2012-11-09T00:37:15.917 に答える
0

カプセル化について:

人々のグループ (大企業や銀行など) の機密データを管理するアプリケーションを想像してください。この情報を処理する方法を示すために、次のクラスを記述できます。

public class Test {
    public static void main(String args[]) {
        CarbonBasedLifeform joeBloggs = new CarbonBasedLifeform("Joe Bloggs", "987-65-4320");
        System.out.println(joeBloggs.name);
    }
}
class CarbonBasedLifeform {
    String name;
    String SSN;
    public CarbonBasedLifeform(String name, String SSN)
    {
        this.name = name;
        this.SSN = SSN;     
    }
}

このコードを実行すると、「CarbonBasedLifeform」というクラスが作成され、インスタンスも作成されます。Joe Bloggs さん、他のプログラマーがプログラムにさらに何かを追加し、このデータの一部をいじり始めたとします。ジョーの社会保障番号を変更しますか? それとも彼の名前?クラスの属性へのアクセスを保護するものは何もないため、簡単に実行できます。

joeBloggs.SSN = "0987654321";

人々がお互いのドキュメントを変更し、そのように個人データを変更できるとしたら、なんと奇妙で不穏な世界になるでしょう。新しいドキュメントを取得するために官僚的なループを通過できるのはジョーだけです。これはプライベートなものです。そのため、値へのアクセスを制御する特別なメソッドとともにクラス属性に修飾子を追加するのが一般的な方法です。つまり、ゲッターとセッター:

class CarbonBasedLifeform {
    private String name;
    private String SSN;
    public CarbonBasedLifeform(String name, String SSN) {
        this.name = name;
        this.SSN = SSN;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSSN() {
        return this.SSN;
    }
    public void setSSN(String SSN) {
        if(verifyRedTape())
            this.SSN = SSN;
        }
    }
}

現在、他のクラスは Joe の属性を直接変更することはできません。これは、属性が としてマークされてprivate おり、メソッドが他のクラスがこのデータと対話する方法を制御するメカニズムを提供するためです。これはカプセル化として知られています。つまり、触れないでください。ジョーのプライベート!

于 2014-09-09T10:30:05.590 に答える