gifts2017

ООП. Инкапсуляция. Часть 1.

Опубликовал fez (fez) в раздел Программирование - Практика программирования

Объектный подход к программированию - это инкапсуляция, наследование и полиморфизм.
Обсудим инкапсуляцию. Что это за зверь?

Часто, при работе с компонентой "Бухгалтерский учет", в конфигурациях встречается конструкция

Сч60_1 = СчетПоКоду("60.1");

Все бы ничего, но ровно до того момента, когда не меняется план счетов. Это происходит не так часто, но на моем веку такое счастье произошло :). И одно из изменений в новом плане счетов - смена кода у счета для учета реализации с 46 на 90. Пересматривать всю конфигурацию на предмет кода 46 для замены на 90 не очень хочется. Даже несмотря на возможности глобального поиска текста в конфигурации - задача не из самых благодарных. Объектный подход предлагает решение для таких проблем, и имя этому решению - инкапсуляция.

Суть счета не поменялась от смены его кода: он так и остался счетом для учета реализации. При грамотном использовании объектов - программист создаст объект "ПланСчетов", в котором будут определены методы СчетУчетаВыручки(), СчетУчетаТоваров(), СчетАвансовПоставщикам() и тому подобные. Для лучшего понимания ниже приведена реализация этих методов для нового ПС

Функция СчетРеализации() Экспорт 
Возврат СчетПоКоду("90.1");
КонецФункции
Функция СчетУчетаТоваров() Экспорт
Возврат СчетПоКоду("41.1");
КонецФункции
Функция СчетАвансовПоставщикам() Экспорт
Возврат СчетПоКоду("60.2");
КонецФункции

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

Функция СчетРеализации() Экспорт 
Возврат СчетПоКоду("90.1.1");
КонецФункции

и добавляем еще один:

Функция СчетРеализацииЕНВД() Экспорт 
Возврат СчетПоКоду("90.1.2");
КонецФункции

Подобное скрытие деталей реализации (в нашем случае - коды счетов) за интерфейсами (методами с человеческими именами) и называется инкапсуляцией.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Михаил Ражиков (tango) 10.12.08 15:49
В типовой (УПП?) что-то похожее встречалось, да.
"Инкапсуляция на последней миле"
Скоро план счетов вообще станет не регистром учета, а чисто жупелом.
2. Максим (Fuego) 10.12.08 15:56
(1) А когда план счетов был регистром учёта?..
4. Андрей Скляров (coder1cv8) 10.12.08 16:10
Это чего? Семерошники таким извратом вместо предопределенных занимаются?... )
5. Михаил Ражиков (tango) 10.12.08 16:45
(4) ?
вот "васмерашники" (упп):
Сч62_01 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
Сч62_21 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.21");
Сч62_31 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.31");
Сч90 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90");
Сч62_02 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
Сч62_22 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.22");
Сч62_32 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.32");
Сч86 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("86");
Сч58_03 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("58.03");
Сч60_02 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.02");
Сч60_22 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.22");
Сч60_32 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.32");
Сч91_01 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.01");
6. Михаил Ражиков (tango) 10.12.08 16:47
а вот еще прикольней, из той же УПП:
СчетКоррБУ = ПланыСчетов.Хозрасчетный.НайтиПоКоду(КодСчетаКоррБУ);
7. Артур Аюханов (artbear) 10.12.08 17:22
(0) Федор, в первой же строке баг :)
"Обектный подход к программированию" :)

А вообще плюс, без вопросов.
8. Дмитрий Воробьев (vde69) 10.12.08 17:25
вообще это не "Инкапсуляция" а "модульность"

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

то-есть это закрытие данных обьекта за програмную оболочку, то-есть запрет прямого обращения к полям!!! в семерке нельзя закрыть доступ к полям данных, по сколько нету разделения на области видимости.
9. Михаил Ражиков (tango) 10.12.08 17:49
А модульность ("вся система должна быть разделена на части, называемые модулями. Это деление более крупное, чем разбиение на классы - модули должны их в себе содержать") тут в чем?
10. Олег Пономаренко (O-Planet) 10.12.08 18:04
Статью - ф топку, или переименовать, или привести другой пример. то, что сейчас, к инкапсуляции имеет очень сомнительное отношение. Инкапсуляция - это объединение данных с методами их обработки. Приведенный в статье пример можно - не в тему. Можно вообще использовать глобальную переменную: глСчетРеализации. По идее статьи это тоже будет инкапсуляция.
11. fez (fez) 10.12.08 18:52
(7) Спасибо, Артур. На домашней клавиатуре твердый знак плохо нажимается :)
12. fez (fez) 10.12.08 18:54
(8) А никто и не говорит, что семерка - это объектно-ориентированный язык программирования. Но если понимать, зачем это нужно - можно ведь и не обращаться к полям данных самостоятельно. Усилием воли. Несмотря на то, что язык позволяет это делать.
13. fez (fez) 10.12.08 18:57
(10) Согласен. глСчетРеализации - это тоже инкапсуляция. Дело в том, что инкапсуляция сама по себе не является отличительной чертой только и исключительно объектно-ориентированных языков программирования. Это некоторый прием програмирования, который позволяет решать определенные задачи. Объектно-ориентированные языки всего лишь активно поддерживают инкапсуляцию своим синтаксисом.
14. fez (fez) 10.12.08 18:58
(4) Нельзя ли поподробнее про предопределенные? В восьмерке я не очень, так что с интересом послушаю.
15. Андрей Скляров (coder1cv8) 10.12.08 19:13
(14) предопределенные элементы - это элементы созданные на этапе конфигурирования, для которых задано имя и к которым по этому имени можно обращаться из кода, например: ПланыСчетов.Хозрасчетный.СчетРеализации
Таким образом, изменение кода элемента не влияет на логику работы конфигурации.
(5) Не знаю чего уж там в УПП, но обычно так не делают...
16. fez (fez) 10.12.08 19:17
(15) Ага, понятно. Завтра будет часть вторая, где я постараюсь рассказать, чем может оказаться плох и такой подход тоже (на примере констант 7.7).
17. Дмитрий Воробьев (vde69) 10.12.08 19:59
(16) если уж и обсуждать эту тему, то только в разрезе восьмерке, там реализация будет такая:

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

ПроверкаПароля
СменаПароля

при этом проверка и смена могут внутри себя вычислять хеш и хранить уже его и в добавок выполнять еще действия (например писать лог)


Вот это будет уже ближе к САБЖУ, но все равно это НЕ Инкапсулирование
18. Олег Пономаренко (O-Planet) 10.12.08 20:33
(13) // Согласен. глСчетРеализации - это тоже инкапсуляция.

Да нет же! Это - параметризация, не больше, только параметр глобален. Инкапсуляция - это объединение данных с методами работы над ними. В контексте ООП - это объединение переменных и процедур в один класс.
19. Олег Пономаренко (O-Planet) 10.12.08 20:35
Инкапсуляцию в 1С можно увидеть, рассматривая встроенные объекты, такие, как Справочник, Документ. С документом можно работать, как с единицей информации, но в своей структуре он имеет параметры (поля) и функции.
20. ineoosaki (ineoosaki) 10.12.08 22:52
Еще, над этим подискутируйте:

http://stupid1snik.narod.ru/

В статье, автор, о наследовании (приминительно к 1с) рассуждает.
22. Артур Аюханов (artbear) 11.12.08 06:50
(18) (10) Нет, ты не совсем прав :(
ИМХО в инкапсуляции главное это как раз сокрытие реализации от клиента, а уж объединение данных и кода это вторично :)

Например, можно представить класс, в котором нет данных, а только спрятанные методы и открытый интерфейс.
23. Артур Аюханов (artbear) 11.12.08 06:53
(0) Ссылка на вторую часть статьи желательно бы к этой статье приложить :)
ЗЫ ну и наоборот, конечно.
25. BabySG (BabySG) 11.12.08 18:59
(21) Смешная статья :)
То, что там написано реализуется через Подписки на события.
И автор не учитывает, что очень часто требуется изменить саму логику проведения и придется ПОЛНОСТЬЮ переписать процедуру проведения.

Вот на этом обычно и спотыкается ООП в 1С.
Наследование от документа "Инвентаризация" что может дать, за исключением геморроя в регистрах и прочего?

ЗЫ. Что бы не было воплей - занимался несколько лет системным программированием на С++ - так что ООП знаю не по наслышке.
26. Олег Пономаренко (O-Planet) 11.12.08 20:27
(22) Этимологически, инкапсуляция - это сокрытие. Второе значение - согласование. В применении к программированию термин инкапсуляция используется во втором значении. Иначе, чем инкапсуляция отличается от процедурности и той же параметризации? Вообще, всю программу можно представить в виде одной универсальной процедуры с входными параметрами. Собственно, на С так и есть. Но сказать, что мы инкапсулируем программу в функцию main будет неправильно. А вот сказать, что методы инкапсулируются в класс - звучит верно.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа