Какая разница, если я объявляю и получаю доступ к свойству класса напрямую? - PullRequest
0 голосов
/ 14 января 2011
public class MyData {
    public String id_number,first_name,last_name,age,level;
    public MyData(String raw_string){
        String[] parameters = raw_string.split(",");
        for(int x = 1;x<parameters.length;x++){
            String[] key_val = parameters[x].split("=");
            if(key_val[0].equalsIgnoreCase("ID")){
                id_number = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("FN")){
                first_name = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("LN")){
                last_name = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("AG")){
                age = key_val[1];
            }
            if(key_val[0].equalsIgnoreCase("LV")){
                level = key_val[1];
            }
        }
    }
}

Я обычно объявляю классы, подобные приведенным выше, в своих школьных проектах, и теперь я программирую для приложений реального мира, я практиковался с использованием подхода get - set, понимая, что он обеспечивает управление только для самого класса.

Насколько я понял, объявление свойств класса, подобных приведенному выше, может привести к неожиданному изменению значения просто на MyData.name = "Here's a new name for me.";

Будучи ленивым, я склоняюсь к этой практике, потому что набираюgetName(); и setName("This is my name"); слишком много времени (я знаю, IDE может ускорить процесс, но все же ...)

Не говоря уже о времени, которое требуется для написания двух функций (получить и установить, плюсclear() при необходимости) для каждого свойства.Итак, вопрос в том, действительно ли мне нужно соблюдать подход get-set?

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

Ответы [ 3 ]

6 голосов
/ 14 января 2011

Ответ на этот вопрос вращается вокруг хорошего стиля программирования, и в зависимости от того, сколько людей прочитают этот вопрос, вы получите довольно много очень злобных ответов, которые непреклонны, что даже задавать этот вопрос - грех. Короткий ответ - это инкапсуляция кода .

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

В свете этих трудностей и многих других, о которых я не упомянул (самый большой результат которых заключается в том, что вы будете менять многие части своего кода много раз после их написания), программисты придумали ряд практических приемов. которые делают программирование более терпимым. Одна из самых важных вещей, которые вы можете сделать, - это изолировать изменения в ваших программах. Это означает, что когда вы изменяете что-то в одной части вашей системы, это должно включать как можно меньше изменений в других частях вашей системы.

Инкапсуляция - это один из способов помочь вам добиться этой изоляции изменений. Если вы решите что-то изменить в классе MyData, вам придется изменить каждый класс, использующий MyData. Например, скажем, вы решили, что MyData должен содержать гораздо больше, чем 5 полей, которые вы определили, или что поля, которые хранит MyData, должны динамически изменяться во время выполнения. Я бы сделал это, предоставив MyData частный HashMap, содержащий все ваши строки, к которым затем можно получить доступ по ключу.

В этой ситуации, если бы вы использовали getFirstName (), getLastName () и т. Д., Другие классы, использующие MyData, не поняли бы, что что-либо изменилось, и продолжили бы свое дело. Но то, как вы делаете вещи, выставляя данные, каждый из них должен быть модифицирован, превращая несколько минут работы в дни или больше. (И поверьте мне, такие мелкие утилиты обычно используются во многих местах.)

Кроме того, постарайтесь не застрять на примере, который я вам дал. Я могу вспомнить как минимум 5 других примеров, так что сказать, что этот пример никогда не случится с вами, или найти другой способ его решения, это не только упустить смысл, но и полностью упустить смысл.

2 голосов
/ 14 января 2011

Ну, это зависит от того, что вы подразумеваете под «потребностью».Если вы хотите получить какую-либо степень инкапсуляции, вам не следует открывать открытые поля.Если вы хотите иметь возможность изменять детали реализации того, как хранятся данные, или проверять любые значения, заданные в поле и т. Д., То вам нужно использовать свойства.

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

OfКонечно, в инкапсуляции гораздо больше, чем , просто с использованием свойств вместо открытых полей, но это фундаментальная отправная точка IMO.

Я бы настоятельно настоятельно рекомендовал бы вам использовать свойства.

0 голосов
/ 14 января 2011

Я бы полностью согласился с другими ответами.Но обилие великолепных интегрированных сред разработки с поддержкой рефакторинга, таких как Eclipse и IntelliJ, позволит вам легко изменять свойства доступа к полю для доступа получателя / установщика (и многих других).

Если вы пишете программу, которая будет использоваться другими разработчиками (скажем, с использованием контроля версий, например CVS), тогда было бы лучше придерживаться написания красиво инкапсулированных классов стиля getter / setter, чтобы избежать ненужного рефакторинга(порождая много за глупые конфликты слияний) заранее.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...