|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.07.2009, 14:08 | #1 |
Регистрация: 02.07.2009
Сообщений: 3
|
Прошу совета в проектировании классов
Добрый день.
У меня вопрос по проектированию. Пусть имеется некоторая иерархия классов, например, базовый класс - Data, от него унаследованы классы FragmentData, TaskData и ParamData. Каждый из классов содержит некоторые данные. Также имеется класс Program, у которого есть три поля (аттрибута) типа FragmentData, TaskData и ParamData. Имеется необходимость для класса Program осуществлять генерацию в файл. Я вижу два варианта организации: 1. В классе Data создать абстрактный метод generate, а в каждом наследнике его реализовать. Тогда Program.generate() будет просто вызывать generate() для каждого своего аттрибута. 2. Создать отдельный класс Generator, который получает на вход Program и на его основе осуществляет генерацию. Плюс первого подхода: выглядит более объектно-ориентированным, функция обработки инкапсулирована вместе с данными. Плюсы второго подхода: если необходимо добавить новый способ генерации, то достаточно создать новый класс, тогда как в первом подходе необходимо доработать каждого наследника от Data (в этом смысле второй подход примерно походит на MVC). Кроме того, если мы выбираем второй подход, то классы FragmentData, TaskData и ParamData фактически вырождаются в обычные структуры, т.к. кроме хранения данных других функций не выполняют. Имеет ли вообще тогда смысл их оформлять как классы? Заранее спасибо. Сергей |
02.07.2009, 15:59 | #2 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Цитата:
Второй подход выглядит гибче. Только нужна ли Вам эта гибкость? У Вас же наследование используется, так что классы это, а не структуры В общем тут сами выбирайте метод. Оба имеют право на жизнь со своими оговорками. Если знать что за классы эти и какие функции они выполняют, то уже можно выбрать наиболее подходящий из этих подходов. Если генерация в файл занимает мало места, сами классы мелкие и простенькие, то можно и первый использовать. Если эти классы подразумевают работу с файлами и это является одной из их функций, то генерацию в файл опять же можно по первому методу делать. Согласитесь, глупо для класса файлового потока выносить работу с файлом в другой какой-то класс. Если эти данные могут быть получены не только из файла и вообще к способу хранения мало относятся, то предпочтительнее будет вероятно второй способ. Например, зачем в класс string добавлять методы сохранения в файл? Пусть этим занимается специальный класс. Ну и смотря какие библиотеки используются. Для MFC, например, есть вариант использования сериализации для этой цели. |
|
02.07.2009, 17:36 | #3 | ||
Регистрация: 02.07.2009
Сообщений: 3
|
Цитата:
Да, но если в классе нет ни одного метода, а только аттрибуты, то наследование какое-то искусственное получается... Первая версия транслятора была написана на С++ в процедурном стиле. Там всё было просто: вот дерево программы (множество структур), вот процедуры, их обрабатывающие. Новую версию хочу написать в объектном стиле, вот и встала проблема с декомпозицией. Цитата:
Никаких посторонних библиотек. Только С++ и STL. |
||
02.07.2009, 18:19 | #4 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Цитата:
Цитата:
Плюс наследования - это можно утверждать, что Собака - это есть животное и кошка - это есть животное. Можно унаследовать квартиру от гаража (у него же есть адрес и площадь, а для квартиры всё нужное добавим), но получится истинным выражение: квартира - это есть гараж. Глупо как-то получается Так что с наследованием с этого конца посмотрите: что эти хххData представляют из себя и что реализуют. Моё видение возможной реализации в целом: Набор классов типа: функция, метод, класс, переменная, цикл, комментарий,... в общем на основные блоки программы по классу (никаких зависимых от языка программирования вещей тут храниться не должно). Наследуем их от базового класса: блок программы. Некий абстрактный класс реализующий чтение и запись программы на конкретном языке программирования: Код:
Код:
Код:
|
||
02.07.2009, 20:05 | #5 |
Регистрация: 02.07.2009
Сообщений: 3
|
То, что вы перечислили - это уже очень сильно зависит от языка, точнее - от класса языков. Переменные, циклы, функции - всё это есть только в императивных языках. Например, в функциональных языках циклов нет, а переменные имеют другой смысл. Так что перевод "конструкция в конструкцию" не сработает. Надо делать полноценный анализ исходной программы, на основе которого с нуля писать новую программу.
|
02.07.2009, 20:09 | #6 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Согласен. Я это понял уже в процессе написания сообщения, но уж не стал удалять, вдруг ход мыслИ полезным будет
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выручайте, прошу совета. | RickKick | Помощь студентам | 1 | 23.05.2009 09:55 |
Прошу совета ! | Kamelli_13 | Общие вопросы Delphi | 1 | 18.05.2009 22:10 |
Прошу совета по поводу построения диаграммы. | annack | Microsoft Office Excel | 6 | 27.03.2009 14:17 |
прошу совета мо монитору | andrey_tmn | Компьютерное железо | 4 | 18.03.2009 20:03 |
Гарантия.Прошу совета. | Elm0 | Свободное общение | 7 | 09.10.2007 17:48 |