OOD - установить значение один раз, чтобы его нельзя было изменить - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь понять принцип сокрытия информации.Предположим, что у меня есть класс транспортного средства с такими методами, как getSpeed, setSpeed, getEngine, setEngine, getVIN, setVIN и т. Д. Чтобы обеспечить скрытие информации, я не хотел бы предоставлять классам клиентов возможность устанавливать VIN, поскольку у транспортного средства только один VIN.(Я могу быть не прав).Я не совсем понимаю, как заставить этот класс применять скрытие информации.Я бы не хотел делать setVIN приватным.Но как вы устанавливаете VIN один раз и не позволяете установить его позже?Или мне вообще так делать?

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Скрытие информации означает, что вы не выставляете внутреннее поле VIN для прямого изменения извне. Наличие сеттера не нарушает принцип сокрытия, потому что у вас есть контроль над модификацией полей.

В вашем случае, если вы хотите убедиться, что VIN установлен только один раз, лучший способ сделать это - установить его в конструкторе и удалить setVIN.

Кстати, хотя это общий вопрос (и это хорошо), если вы имеете в виду конкретный язык, стоит упомянуть. Например, некоторые языки не допускают использование конструкторов не по умолчанию. На таком языке я оставляю setVIN, но проверяю, был ли VIN уже установлен при вызове. Если это так, либо проигнорируйте вызов, либо сгенерируйте исключение.

0 голосов
/ 05 октября 2011

То, что класс / объект имеет свойство, концептуально говоря, не означает, что оно должно быть публичным. «Свойство» может быть назначено и изменено с помощью функций «getter» и «setter», но вы можете предоставлять в качестве общедоступных только те, которые вам нужны.

Вы можете сказать: «Покажите мне код»:

public class JavaClass {

    // hidden field "name"
    protected String name;  

    // start property "Name"
    // note: uses "name" field to store the property
    public void setName(String value) {
        //set passed parameter as name
        name = value;
    }
    public String getName() {
        return name;
    }
    // finish property "Name"

    // start property "Id"
    // note: uses "name" field to store the property
    public void setId(String value) {
        //set passed parameter as name
        name = value;
    }
    public String getId() {
        return name;
    }
    // finish property "Id" 

    // hidden field "years"
    protected int years
    // functions works as "read-only" properties
    public int Years() {
      return years;
    }   

    // start constructor
    public JavaClass() {
            name  = "unknown";
            years = 1;
    }
    // finish constructor

    public static void main(String args[]) {     
        JavaClass javaObject = new JavaClass();

        //set name member of this object
        javaObject.setName("Visitor");

        // print the name
        System.out.println("Hello: " + javaClassExample.getName());  

        //set name member of this object
        javaObject.setId("Employee");

        // print the name, not the Id, but are the same
        System.out.println("Hello: " + javaClassExample.getName());  

        // and current years of age
        System.out.println("Years: " + javaClassExample.Years());       
    } // public static void

} // class JavaClass

Это не проверено, но, я думаю, это объясняет мою точку зрения.

...