Самостоятельно приступил к освоению ООП. Из учебников примеры выходят, но как только берусь за свой код — тупик.
Конкретно:
Клик по кнопке "открыть файл" > событие > обработчик.
В обработчике диалог OpenFile > ... а что дальше?
В стиле ООП не могу сообразить. Что хочу, понимаю, а как оформить в капсулу, без глобальных переменных, без главенства функции над объектом...
Нужно-то всего лишь на основе данных из файла создать объект. А как это сделать красиво?
Вот, ход моих рассуждений:
Получив имя файла, вызываю свою функцию
OpenМemo (FileName, memo1); // Функция открывает файл, читает данные и размещает их в memo1 — объект моего класса.
Значит выше, в этом обработчике необходимо ввести
Memo memo1; // построить объект класса Memo
Функция OpenMemo — это ведь процедурное мышление?
Кроме того, я создаю в обработчике глобально юзаемый по всей программе объект memo1. Неужели так это и делается?
Чувствую, что это как-то через некрасиво.
Примеров в книжках не нашёл. В чужих исходниках мозги заблудились. Подтолкните мысль, пожалуйста.
Re: ООП 1-е шаги. Создать объект, загрузить из файла данные
Здравствуйте, 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-е шаги. Создать объект, загрузить из файла данные
Уважаемый, потрудитесь нормально объяснить что за объект хотите создать?
К тому же, если класс имеет процедуру — это не "процедурное мышление", ведь инкапсуляция на то и нужна, чтобы объединять данные и способы их обработки.
Re: ООП 1-е шаги. Создать объект, загрузить из файла данные
Здравствуйте, Bitfry, Вы писали:
B>Нужно-то всего лишь на основе данных из файла создать объект. А как это сделать красиво? B>Вот, ход моих рассуждений: B>Получив имя файла, вызываю свою функцию
Неправильный ход рассуждений.
Получив имя файла, ты создаешь свой объект, передав ему в конструктор имя файла в качестве аргумента.
Конструктор открывает файл, читает его, распихивает данные по полям объекта. Если что не так — конструктор кидает исключение.
В результате ты или получаешь полностью готовый объект, или исключение с соответствующей ошибкой.
B>OpenМemo (FileName, memo1); // Функция открывает файл, читает данные и размещает их в memo1 — объект моего класса.
Неправильный подход.
Никакая функция "снаружи" не должна иметь прямого доступа к полям класса. На то она и изоляция с инкапсуляцией.
B>Функция OpenMemo — это ведь процедурное мышление?
Да.
B>Кроме того, я создаю в обработчике глобально юзаемый по всей программе объект memo1. Неужели так это и делается?
Зависит от логики программы.
Почему твой объект юзается во всей программе? Если там какие-нибудь конфиги хранятся, то можно и глобально заюзать.
А если у тебя там просто "всякая полезная мелочь" в кучу свалена — надо подумать, не стоит ли разобраться в этой куче и рассортировать все по отдельным объектам.
Бзззззззжжжжж
Re: ООП 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-е шаги. Создать объект, загрузить из файла данн
Спасибо chemey и breee breee. По первому вопросу всё предельно ясно:
метод или конструктор объекта, а не отдельная функция.
Сейчас вспомнил, вначале кодил так, но компилятор заваливал ошибками и вместо того чтобы выше объявить объект, я избавился от всех ошибок выносом "распихивания" во внешнюю функцию OpenMemo. Скомпильнулось, заработало, и забыл, пока не уткнулся в полный тупик.
Со вторым вопросом, честно говоря, нет ясности в мозгах. Но мысль направлена, теперь надо самому подумать.
Ещё раз Спасибо.
В основном, читаю специальное издание Страуструпа и практикуюсь на "Standard Library from Scratch" Пабло Халперна. Он всю книгу вместе с читателем разрабатывает и кодит одну программу — TinyPIM (телефонная книжка). Я решил над этим кодом издеваться. Вместо консоли сделать вин форму и добавить работу с файлами.