Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [ООП] А нужно ли выделять один метод в класс? Простой код для отдельного класса 
:(
    Опции темы
Darkmaster
Дата 26.2.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Недавно у меня возник достаточно простой вопрос, ответ на которые я для себя пока так и не нашел, посему решил обратиться на форум винград. Итак, у меня есть форма, в которой представлено несколько текстовых поле и кнопка. По нажатию на кнопку "Добавить" данные из текстовых полей заносятся в таблицу. При этом логика добавления данных вынесена в отдельный метод Add, вызываемый при нажатии на кнопку. Метод очень простой:

Код

private void Add() 
        {
            DataRow row = bridge.Employes.NewRow();
            row["firstname"] = f_nametextBox.Text;
            row["lastname"] = l_nametextBox.Text;
            DateTime hiredate;
            if (DateTime.TryParse(HireDateTextBox.Text, out hiredate))
                row["hiredate"] = hiredate.ToShortDateString();
            else
            {
                MessageBox.Show("HireDate is failed");
                return;
            }
            DateTime termdate;
            if (!DateTime.TryParse(TermDatetextBox.Text, out termdate))
                row["termdate"] = null;
            else
                row["termdate"] = termdate.ToShortDateString();
            row["phone"] = PhonetextBox.Text;
            row["timestamp"] = null;
            bridge.Employes.Rows.Add(row);
            this.Close();
        }


После того как я это написал у меня возник следующий вопрос: имеет ли смысл выделить этот метод в отдельный класс? Например, чтобы вместо текстовых полей использовать в его коде простые текстовые переменные (хотя это можно и так сделать, просто добавив параметры в метод, а текстовые поля присваивать им в его вызове). Т.е. имеет ли смысл создавать класс ради этого одного метода или же его стоит оставить в теле класса-формы? 
--------------------
GeekTV - интернет-телевидение для гиков
PM MAIL   Вверх
1000000dollars
Дата 26.2.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 6.10.2007

Репутация: нет
Всего: 8



Предлагаю сравнить два кода:

Код

void Form::ButtonClick()
{
Add();
}

void Form::MenuClick()
{
Add();
}

void Form::Anything()
{
Add();
}


и
Код

void Form::ButtonClick()
{
            DataRow row = bridge.Employes.NewRow();
            row["firstname"] = f_nametextBox.Text;
            row["lastname"] = l_nametextBox.Text;
            DateTime hiredate;
            if (DateTime.TryParse(HireDateTextBox.Text, out hiredate))
                row["hiredate"] = hiredate.ToShortDateString();
            else
            {
                MessageBox.Show("HireDate is failed");
                return;
            }
            DateTime termdate;
            if (!DateTime.TryParse(TermDatetextBox.Text, out termdate))
                row["termdate"] = null;
            else
                row["termdate"] = termdate.ToShortDateString();
            row["phone"] = PhonetextBox.Text;
            row["timestamp"] = null;
            bridge.Employes.Rows.Add(row);
            this.Close();
}

void Form::MenuClick()
{
            DataRow row = bridge.Employes.NewRow();
            row["firstname"] = f_nametextBox.Text;
            row["lastname"] = l_nametextBox.Text;
            DateTime hiredate;
            if (DateTime.TryParse(HireDateTextBox.Text, out hiredate))
                row["hiredate"] = hiredate.ToShortDateString();
            else
            {
                MessageBox.Show("HireDate is failed");
                return;
            }
            DateTime termdate;
            if (!DateTime.TryParse(TermDatetextBox.Text, out termdate))
                row["termdate"] = null;
            else
                row["termdate"] = termdate.ToShortDateString();
            row["phone"] = PhonetextBox.Text;
            row["timestamp"] = null;
            bridge.Employes.Rows.Add(row);
            this.Close();
}

void Form::Anything()
{
            DataRow row = bridge.Employes.NewRow();
            row["firstname"] = f_nametextBox.Text;
            row["lastname"] = l_nametextBox.Text;
            DateTime hiredate;
            if (DateTime.TryParse(HireDateTextBox.Text, out hiredate))
                row["hiredate"] = hiredate.ToShortDateString();
            else
            {
                MessageBox.Show("HireDate is failed");
                return;
            }
            DateTime termdate;
            if (!DateTime.TryParse(TermDatetextBox.Text, out termdate))
                row["termdate"] = null;
            else
                row["termdate"] = termdate.ToShortDateString();
            row["phone"] = PhonetextBox.Text;
            row["timestamp"] = null;
            bridge.Employes.Rows.Add(row);
            this.Close();
}

А теперь предлагаю немного изменить логику добавления, например, введя ещё одно поле smile

Ну и я бы сдеал метод Add с параметрами, в которые передавал бы f_nametextBox.Text, l_nametextBox.Text и всё, что мне ещё понадобится.
PM MAIL   Вверх
Darkmaster
Дата 26.2.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



1000000dollars:

Так метод Add как раз есть уже. Все как вы показали работает в первом примере. Просто я думаю насчет того, стоит ли этот метод Add вынести за класс-форму в отдельный класс. Что-то вроде класса, который будет отвечать только за добавление в базу данных. Например, если мы захотим поменять интерфейс нашей программы с Windows Forms на WPF будет удобно, что логика добавления находится отдельно от формы, которая нам больше не нужна. С другой стороны делать класс с одним методом странно...

Т.е. грубо говоря сейчас есть файл с классом-формой, в котором есть метод Add. А я думаю вынести этот метод в отдельный класс. И может даже в отдельный файл .cs для удобства.
--------------------
GeekTV - интернет-телевидение для гиков
PM MAIL   Вверх
smartov
Дата 26.2.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Darkmaster, 1kdollars как бы намекает, что если ты захочешь этот метод повесить на другие события, то не копировать же его. Соответственно нужно абстрагироваться - разделить логику и представление. Подумать над структурой классов более глобально. 
Возможно имеет смысл сделать класс-диспетчер, методы которого будут дергаться из разных событий формы.
PM MAIL   Вверх
1000000dollars
Дата 26.2.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 6.10.2007

Репутация: нет
Всего: 8



Darkmaster, ага, теперь понял в чём вопрос.

Прежде чем отвеать на него напомню определение одного из основных механизмов ООП - инкапсуляции. Как утверждает википедия, "Инкапсуля́ция — свойство языка программирования, позволяющее объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста)."
Ключевым моментом в этом механизме является объединение данных и кода, который их обрабатывает, в единую сущность - объект.

Из этого следуют такие ответы:
Цитата(Darkmaster @  26.2.2010,  14:25 Найти цитируемый пост)
стоит ли этот метод Add вынести за класс-форму

Да, потому что метод Add обрабатывает данные хранилища (сохраняет в нём информацию).

Цитата(Darkmaster @  26.2.2010,  14:25 Найти цитируемый пост)
Что-то вроде класса, который будет отвечать только за добавление в базу данных

Что-то вроде класса, который будет отвечать за добавление в базу данных, удаление из базы данных, изменение базы данных и т.д.

Цитата(Darkmaster @  26.2.2010,  14:25 Найти цитируемый пост)
делать класс с одним методом странно

Не странно, если этот класс является частью архитектуры.

Теперь, если позволите, расскажу как я вижу предложенный кусок кода в архитектурном смысле.
Есть класс, представляющий базу данных (какое-то абстрактное хранилище, которое )
C_DataBase
{
public: 
 void Add (String firstname, String lastname, DateTime hiredate, DateTime termdate,  String phone);
 /// наверняка ещё какие-то методы, которые вне контекста задачи писать не могу
}

Есть форма, которая позволяет получить от пользователя ввод.
C_Form
{
 private:
 C_DataBase db;

 public:
 void ButtonClick()
  {
    db.Add(f_nametextBox.Text, l_nametextBox.Text, StrToDateTime(HireDateTextBox.Text), StrToDateTime(TermDatetextBox.Text));
  }
}

Хранилище и интерфейс пользователя получаются слабо связаны - получен желаемый результат. smile
PM MAIL   Вверх
Rad87
Дата 12.8.2010, 16:47 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Как вариант подобные функции можно убирать в отдельный cpp файл. Тем самым можно логически отделить и дать удобную возможность использовать её повторно. Дополнительным бонусом получаем сокрытие реализации данной функции за .h  файлом.
PS В данном, конкретном, случае может быть логичней создать класс с более широкими возможностями
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.