![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]()
Доброго времени суток, форумчане!
![]() P.S - если я запостил не туда (неверный топик, ветка или еще что), то, пожалйста, переместите ![]() Итак, желание написать этот пост возникло после углубления в концепцию абстрактных типов данных. Я не особо хорошо понимал чем же отличаються АТД от классов. Все же, после долгих размышлений я пришел к неким выводам и объяснениям, которыми, собственно, и хочу поделиться. Начнем с определения АТД. Наверное лучшее определение АТД дано на википедии). И все же я дам определение собственными словами: АТД - это тип данных, предоставляющий согласовынный набор функций-членов для работы с данным АТД и взаимодействия с другими АТД. "Абстрактный" потому, что позволяет моделировать абстрагированную от низкоуровневой реализации сущность. Конечно, работа сущности включает низкоуровневость, но позже, мы на это обращать внимания не будешь. Вопрос: Почему в названии фигурирует именно "тип данных", а не "структура данных"? Ответ: Потому, что тип данных как таковой определяет именно набор операций и множнство значений, применямых относительно типа данных. АТД позволяет нам работать на высоком уровне абстрации (а не на низком). Это достигается абстракцией реализации - т.е нам не важно из чего состоит объект, нам важны операции, относительно него. (или так: неважно какой у объекта цвет кожи, важно то какие функции он выполняет). В книге Стива МакКоннела "Совершенный код" очень хорошо обсуждаются АТД и какую роль они играют при создании класса. "Совершенный код": При написании очередного класса очень важно подумать о нем как о АТД: Мое объяснение этого утверждения: нам нужно сосредоточиться над логической группировкой и созданием операций, предоставляемых классом (т.е контракт), вне зависимости от того, какими данными этот класс будет оперировать в будущем (при дальнейшем, детальном проектировании) Пример из реальной жизни: Есть строительная компания "OOO как-то там"... создатели этой компании изначально (еще раз: изначально!) определили контракт, который они будут выполнять отосительно своих клиентов. Т.е в этот контракт входят пункты: - осуществить постройку - закупка материалов для постройки - предоставление материалов - еще что-то - и что-то еще Заметьте, что они не думали о персонале или о процессе строительста или о строительных материалов (т.е о том, как будет выполнен контракт), они от этого абстрагировались. В последствии, создатели компании наймут персонал или уволят кого-то, перестроят структуру управления компанией или создадут филиалы в других странах... но одно останется неизменным: КОНТРАКТ! Конечно, филиалы - это наследники, и они могут дополнять контракт (но не изменять/замещать его! - это уже из области LSP). Т.е важен контракт, а не низкоуровневая реализация при работе с АТД или его создании. Так в чем же отличие АТД от класса, зачем понадобилось вводить понятие "АТД", если можно было ограничиться и понятием "класс"? Во-первых понятие "АТД" возникло задолго до появления понятия "класс". Я считаю, что класс лишь дополнил концепцию АТД. Дело в том, что при создании класса мы уже по-сути должны были выделить данные, с которыми он будет оперировать и которые ббудут его составлять. В случае с АТД мы концентрировались только на операциях, но не на данных с которыми можно было бы эти операции соотнести. В случае с классом мы уже будем концентироваться и данных и дальнейшем их поддержании, структуризации, построении иерархии классов, определять как будут себя вести объекты отдельного класса из иерархии (полиморфизм). Осталось неизменным и определнным в начале проектирования класса одно: АТД. Изначально созданный АТД, в последствии, может быть применен для создания классов во множествах отдельных разрабатываемых систем. Класс = АТД + полиморфизм + наследование. - из книги Стива МакКоннела "Совершенный код". Выводы: - Классы дополняют АТД. - АТД позволяет сосредоточиться на интерфейсе, а не на реализации АТД. Ведь мы думаем об операциях, в первую очередь. - АТД позволяет работать с высокоуровневыми абстракциями и не задумываться как они реализованы на низком уровне. - В центре внимания АТД - интерфейс. P.S - может это и довольно глупо с моей стороны писать пост, посвященный АТД, но здесь я смог выразить свои мысли и премеры относительно этого понятия (не пинайте сильно :-)). Если у Вас есть какие-нибудь размышления/дополнения/замечания к статье, то пожалуйста, оставьте комментарий. Спасибо, что прочли. Дополнительные материалы и использованные источники: - http://www.cs.iastate.edu/~hridesh/t...p50-liskov.pdf - Стив МакКоннел - "Совершенный код" Последний раз редактировалось Igor95; 20.01.2014 в 00:47. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]()
Итак, мое представление АТД может быть реализовано так:
Код:
|
![]() |
![]() |
![]() |
#3 | |||||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
![]() Цитата:
Цитата:
Цитата:
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 20.01.2014 в 07:20. |
|||||
![]() |
![]() |
![]() |
#4 | ||
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]() Цитата:
Цитата:
Вчера, во время дискуссии на тему АТД возник вопрос... а чем же АТД отличается от интерфейса как такового? По версии википедии (ссылка приведена в первом посте) АТД представляется в виде интерфейса. Отсюда, следуя логике, АТД == интерфес. Опять же, если интерфейс является абстракцией реализации класса, то АТД утверждает, что может содержать как данные так и методы, в то время как интерфейс содержит лишь методы. Правильно ли я понимаю следующее?: Класс - один из способов воплощения концепции АТД, и кроме того, класс дополняет эту концепцию путем введения иных концепций, таких как полиморфизм и наследование? P.S - помогите разобраться :-) Последний раз редактировалось Igor95; 20.01.2014 в 16:53. |
||
![]() |
![]() |
![]() |
#5 | ||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
Про остальное - будьте внимательны к мелочам. Класс ничего не добавляет. Добавляет ООП. Далее наследование это свойство структурного программирования. То есть относиться не только к ООП. АТД это наверно базовые алгоритмы, которые можно применить не только в одной задаче. Где-то переплетается с обобщенным программированием (ИМХО, разумеется). Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 20.01.2014 в 18:20. |
||
![]() |
![]() |
![]() |
#6 | ||
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]()
Из википедии:
Цитата:
Цитата:
Отсюда, из последнего аьзацца АТД можно понять как некий способ абстрагирования от данных (т.е их инкапсуляция) и сосредоточения внимания на операциях, что совпадает с определением понятия интерфейс... Т.е АТД - это попытка аозволяет думать в рамках интерфейса, инкапсулировав (или абстрагировавшись) от данных, которые обеспечивают работу интерфейса. И получается, что когда говорят, думайте в первую очередь об АТД, а не о классах, то подразумевают, что разработчик должен думать о том как обеспечить такой уровень абстракции, что: - совокупность методов, составляющих интерфейс АТД, была логически сгруппирована (т.е все методы семантически служили бы одной цели, были бы целостносными). - не нужно было бы заглядывать в реализацию класса (т.е изучать его поля/свойства) для того, чтобы понять как он работает. иначе астракией такой АТД не будет. Т.е АТД помогает управлять сложностью путем инкапсуляции деталей реализации АТД (его данных) и тем самым позволив разраьотчику думать в рамках интерфейса, а не АТД в общем. Последний раз редактировалось Igor95; 20.01.2014 в 18:59. |
||
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Не надо сюда натягивать интерфейс так рьяно
![]() Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|
![]() |
![]() |
![]() |
#8 | |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]() Цитата:
Как понять "в не сцепленном виде"? В википедии сказано, что АТД представляется в виде интерфейсов... Я лишь пытаюсь это как-то с АТД связать... http://ru.wikipedia.org/wiki/%D0%90%...BD%D1%8B%D1%85 Последний раз редактировалось Igor95; 20.01.2014 в 19:41. |
|
![]() |
![]() |
![]() |
#9 | |||
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
Цитата:
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 20.01.2014 в 20:41. |
|||
![]() |
![]() |
![]() |
#10 | |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
![]() Цитата:
Это противоречит определению АТД: АТД - набор данны и операций над ними.... |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
АТД на базе созданных АТД | Marikaa | Помощь студентам | 0 | 24.12.2013 23:25 |
Двунаправленный список и атд[C++] | ArniLand | Общие вопросы C/C++ | 0 | 03.07.2010 00:14 |
ТРПО. Ищу примеры документ-концепции и SRS | Subaru | Помощь студентам | 0 | 26.06.2010 10:44 |
Вопрос о концепции GUI | Homer_J_Simpson | C++ Builder | 4 | 15.11.2009 12:11 |