2012-11-09 3 views
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(); 
} 
+3

№ [Инкапсуляция] (http://en.wikipedia.org/wiki/Encapsulation_ (object-oriented_programming)) – moonwave99

+0

Да, я понимаю, что я читаю. Но таким образом $ redis скрыт снаружи ... из-за этого я сомневаюсь – itaka

+1

@itaka: '$ redis' - локальная переменная в этой функции, однако' RedisDB' является супер глобальным именем класса и глобальным статическая функция 'RedisDB :: fetch_instance()' возвращает объект, с которым вы ссылаетесь, с локальной переменной '$ redis' * везде *. Использование более коротких обозначений показывает это лучше: 'RedisDB :: fetch_instance() -> db-> flushdb();' - Как показано на рисунке, ничто не инкапсулировано, потому что «Redis» ничего не предлагает для поддержки фактической инкапсуляции. Чистое глобальное статическое состояние. – hakre

ответ

3

Инкапсуляция скрыть частным полей снаружи. $redis - это всего лишь локальная переменная, и она умрет в конце clean_queues_redis способ исполнения.

+0

На самом деле скрытие полей называется «скрытием информации». Инкапсуляция - это всего лишь способ группировки данных и может использоваться или не использоваться вместе с скрытием информации –

0

О Encapsulation:

Представьте себе приложение, которое управляет конфиденциальными данными из группы людей (например, некоторые крупные компании или банка), мы можем написать следующий класс, чтобы проиллюстрировать, как мы могли бы справиться с этой информацией.

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», а также создан экземпляр, Джо 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; 
     } 
    } 
} 

Теперь другие классы не может изменить атрибуты Джо непосредственно, потому что атрибуты помечаются как private и методы обеспечивают механизм управления, как другие классы взаимодействуют с этими данными, то есть известный как инкапсуляция, или, другими словами, не трогайте рядовых Джо!

Смежные вопросы