ООП 1-е шаги. Создать объект, загрузить из файла данные
От: Bitfry  
Дата: 19.05.11 21:19
Оценка:
Самостоятельно приступил к освоению ООП. Из учебников примеры выходят, но как только берусь за свой код — тупик.
Конкретно:

Клик по кнопке "открыть файл" > событие > обработчик.
В обработчике диалог OpenFile > ... а что дальше?

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

OpenМemo (FileName, memo1); // Функция открывает файл, читает данные и размещает их в memo1 — объект моего класса.

Значит выше, в этом обработчике необходимо ввести

Memo memo1; // построить объект класса Memo

Функция OpenMemo — это ведь процедурное мышление?
Кроме того, я создаю в обработчике глобально юзаемый по всей программе объект memo1. Неужели так это и делается?
Чувствую, что это как-то через некрасиво.
Примеров в книжках не нашёл. В чужих исходниках мозги заблудились. Подтолкните мысль, пожалуйста.
Re: ООП 1-е шаги. Создать объект, загрузить из файла данные
От: fdn721  
Дата: 20.05.11 05:57
Оценка: :)
Здравствуйте, Bitfry, Вы писали:

B>Самостоятельно приступил к освоению ООП. Из учебников примеры выходят, но как только берусь за свой код — тупик.

B>Конкретно:

B>Клик по кнопке "открыть файл" > событие > обработчик.

B>В обработчике диалог OpenFile > ... а что дальше?

B>В стиле ООП не могу сообразить. Что хочу, понимаю, а как оформить в капсулу, без глобальных переменных, без главенства функции над объектом...

B>Нужно-то всего лишь на основе данных из файла создать объект. А как это сделать красиво?
B>Вот, ход моих рассуждений:
B>Получив имя файла, вызываю свою функцию

B>OpenМemo (FileName, memo1); // Функция открывает файл, читает данные и размещает их в memo1 — объект моего класса.


B>Значит выше, в этом обработчике необходимо ввести


B>Memo memo1; // построить объект класса Memo


B>Функция OpenMemo — это ведь процедурное мышление?

B>Кроме того, я создаю в обработчике глобально юзаемый по всей программе объект memo1. Неужели так это и делается?
B>Чувствую, что это как-то через некрасиво.
B>Примеров в книжках не нашёл. В чужих исходниках мозги заблудились. Подтолкните мысль, пожалуйста.

Изучать надо было в начале семестра. А сейчас в армию!
Re: ООП 1-е шаги. Создать объект, загрузить из файла данные
От: irbis3003  
Дата: 20.05.11 06:05
Оценка:
Здравствуйте, Bitfry, Вы писали:

Уважаемый, потрудитесь нормально объяснить что за объект хотите создать?

К тому же, если класс имеет процедуру — это не "процедурное мышление", ведь инкапсуляция на то и нужна, чтобы объединять данные и способы их обработки.
Re: ООП 1-е шаги. Создать объект, загрузить из файла данные
От: chemey  
Дата: 20.05.11 07:44
Оценка: 2 (1)
Здравствуйте, Bitfry, Вы писали:

B>Нужно-то всего лишь на основе данных из файла создать объект. А как это сделать красиво?

B>Вот, ход моих рассуждений:
B>Получив имя файла, вызываю свою функцию

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

Конструктор открывает файл, читает его, распихивает данные по полям объекта. Если что не так — конструктор кидает исключение.

В результате ты или получаешь полностью готовый объект, или исключение с соответствующей ошибкой.

B>OpenМemo (FileName, memo1); // Функция открывает файл, читает данные и размещает их в memo1 — объект моего класса.


Неправильный подход.
Никакая функция "снаружи" не должна иметь прямого доступа к полям класса. На то она и изоляция с инкапсуляцией.

B>Функция OpenMemo — это ведь процедурное мышление?


Да.

B>Кроме того, я создаю в обработчике глобально юзаемый по всей программе объект memo1. Неужели так это и делается?


Зависит от логики программы.
Почему твой объект юзается во всей программе? Если там какие-нибудь конфиги хранятся, то можно и глобально заюзать.
А если у тебя там просто "всякая полезная мелочь" в кучу свалена — надо подумать, не стоит ли разобраться в этой куче и рассортировать все по отдельным объектам.
Бзззззззжжжжж
Re: ООП 1-е шаги. Создать объект, загрузить из файла данные
От: breee breee  
Дата: 20.05.11 09:01
Оценка: 2 (1)
Здравствуйте, Bitfry, Вы писали:

B>Получив имя файла, вызываю свою функцию


B>OpenМemo (FileName, memo1); // Функция открывает файл, читает данные и размещает их в memo1 — объект моего класса.


B>Значит выше, в этом обработчике необходимо ввести


B>Memo memo1; // построить объект класса Memo


B>Функция OpenMemo — это ведь процедурное мышление?


По ООП-шному будет как-то так:
Memo memo1(Filename);

или
Memo memo1;
memo1.ReadFromFile(FileName);


B>Кроме того, я создаю в обработчике глобально юзаемый по всей программе объект memo1. Неужели так это и делается?


Каким образом интересно в обработчике можно создать глобально юзаемый по всей программе объект? Разве что сделать его static и присвоить адрес глобальному указателю.
Обработчик скорее всего является методом некого класса. Объект memo1 или указатель на него можно сделать членом этого класса и юзать во всех методах. При этом он не будет глобальным.
Re[2]: ООП 1-е шаги. Создать объект, загрузить из файла данн
От: Bitfry  
Дата: 20.05.11 16:49
Оценка:
Спасибо chemey и breee breee. По первому вопросу всё предельно ясно:

метод или конструктор объекта, а не отдельная функция.

Сейчас вспомнил, вначале кодил так, но компилятор заваливал ошибками и вместо того чтобы выше объявить объект, я избавился от всех ошибок выносом "распихивания" во внешнюю функцию OpenMemo. Скомпильнулось, заработало, и забыл, пока не уткнулся в полный тупик.

Со вторым вопросом, честно говоря, нет ясности в мозгах. Но мысль направлена, теперь надо самому подумать.
Ещё раз Спасибо.

В основном, читаю специальное издание Страуструпа и практикуюсь на "Standard Library from Scratch" Пабло Халперна. Он всю книгу вместе с читателем разрабатывает и кодит одну программу — TinyPIM (телефонная книжка). Я решил над этим кодом издеваться. Вместо консоли сделать вин форму и добавить работу с файлами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.