Russian Qt Forum
Ноябрь 23, 2024, 00:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 6 7 [8] 9 10 ... 16   Вниз
  Печать  
Автор Тема: Приватные методы  (Прочитано 102235 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #105 : Сентябрь 29, 2015, 16:12 »

Цитировать
Вот-вот, это то, про что я писал еще 5 страниц назад.

Есть у нас класс типа
Опять-таки - это неудачный пример, который вовсе не илюстрирует изначально заявленную проблему (проблему для некоторых). Это проблема не языка, а скорее того, кто единственным решением видит вариант  отнаследоваться..

Мы как то здесь уже обсуждали хороший архитектурный пример, как аналогичное решается в реализации boost::tokenizer. Где подход, использованный там,  позволяет легко менять поведение токенайзера без всякого наследования и при этом, не меняя интерфейса самого класса tokenizer.  


http://www.prog.org.ru/topic_22338_45.html

Обсуждение начинается с поста #50

 

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #106 : Сентябрь 29, 2015, 16:23 »

Этих ConcreteCrap'ов может быть хоть мильён, каким надо таким и инициализируй SomeCrap.  И пользователям SomeCrap не важно, как внутренности ConcreteCrap'а устроены, что там приватно, что публично, можно ли от него наследоваться или нет, есть там поля m_shitValue или всё магией создаётся. Главное чтобы в GetSomeShit() возвращалось ожидаемое по логике класса значение.

В вашем случае SomeCrap - это уже чистый интерфейс. В принципе реализация-то может быть какой угодно - это правда, но это хорошо, когда так с нуля проектируется. А если SomeCrap существует уже достаточно долго и используется везде, где только можно, к тому же у него с десяток методов типа GetSomeShit() - то рефакторинг будет болезненным Грустный

Что касается переопределений в наследниках... ИМХО, человек, наследующийся от чего-либо, должен иметь возможность использовать унаследованный функционал в полном объеме, поскольку он может иметь больше актуальных знаний о предметной области и текущей архитектуре. Пример - опять же, появление нового стандарта/метода/оборудования, о котором изначальный разработчик мог и не подозревать, разве не так?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #107 : Сентябрь 29, 2015, 16:25 »

Нет, не так. Класс проектируется со своей внутренней логикой и предоставляет только нужные части для переопределения. Иначе внутренняя логика может полностью "поехать".
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #108 : Сентябрь 29, 2015, 16:29 »

Цитировать
В принципе реализация-то может быть какой угодно - это правда, но это хорошо, когда так с нуля проектируется. А если SomeCrap существует уже достаточно долго и используется везде, где только можно, к тому же у него с десяток методов типа GetSomeShit() - то рефакторинг будет болезненным
Извините, а чья это вина? Кто принимал решение использовать этот класс? Не тот ли  практик, что проектировал архитектуру, стремился сделать её как можно гибче и расширяемой? Или у практиков таких понятий нет? Сразу садимся писать class MainWindow, а дальше разберёмся по-ходу?  Подмигивающий  
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #109 : Сентябрь 29, 2015, 16:31 »

Я бы сказал, что класс может эволюционировать в каких-то определенных пределах, и как правило, продуманных автором. Вряд-ли кто-то напишет класс аппаратного устройства, который после наследования можно превратить в базу данных. Улыбающийся
« Последнее редактирование: Сентябрь 29, 2015, 16:34 от Old » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #110 : Сентябрь 29, 2015, 16:50 »

Опять-таки - это неудачный пример, который вовсе не илюстрирует изначально заявленную проблему (проблему для некоторых).

В чем же его неудачность? Этот пример - выжимка из реальной проблемы, которую я наблюдал.

Это проблема не языка, а скорее того, кто единственным решением видит вариант  отнаследоваться..

ммм... ООП как раз и подразумевает наследование, не так ли?

Мы как то здесь уже обсуждали хороший архитектурный пример, как аналогичное решается в реализации boost::tokenizer.

Прошу прощения, но я там кроме холивара, ничего не увидел. В чем суть, если в двух словах? Переопределить оператор () ?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #111 : Сентябрь 29, 2015, 16:53 »

Извините, а чья это вина? Кто принимал решение использовать этот класс? Не тот ли  практик, что проектировал архитектуру, стремился сделать её как можно гибче и расширяемой?

Архитектуру проектировал Гугу-Теоретик. По его представлениям, класс не должен был расширяться, ибо 10 лет как существовал единственный стандарт, в котором Гугу шарил. И Гугу считал свой код непогрешимым, поэтому столкал все, что можно, в приваты.

Или у практиков таких понятий нет? Сразу садимся писать class MainWindow, а дальше разберёмся по-ходу?  Подмигивающий 

Это не практик, а быдлокодер...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #112 : Сентябрь 29, 2015, 16:54 »

В том, что вместо одного класса MainWindow, можно предложить пользователю набор кубиков из которых, он будет собирать свое решение. Это позволит менять, расширять, дополнять кубики и соответственно расширять варианты решений.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #113 : Сентябрь 29, 2015, 17:16 »

В том, что вместо одного класса MainWindow, можно предложить пользователю набор кубиков из которых, он будет собирать свое решение. Это позволит менять, расширять, дополнять кубики и соответственно расширять варианты решений.

Ок, но вы же понимаете, что, чтобы использовать данный подход, архитектуру надо изначально проектировать расширяемой. А если Гугу приватит все, что можно - какая может идти речь о расширяемости?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #114 : Сентябрь 29, 2015, 17:21 »

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

P.S. Кстати, вы эпохальное решение "финдреплейсера" видели? Попробуйте его расширить хоть как нибудь. Подмигивающий
« Последнее редактирование: Сентябрь 29, 2015, 17:24 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #115 : Сентябрь 29, 2015, 17:24 »

Цитировать
В чем же его неудачность? Этот пример - выжимка из реальной проблемы, которую я наблюдал.
Ну я об этом чуть выше написал, так что позвольте сразу перейти к последнему вопросу)

Цитировать
Прошу прощения, но я там кроме холивара, ничего не увидел. В чем суть, если в двух словах? Переопределить оператор () ?
Ну хорошо, не увидели, ладно.. В двух словах:
Вот Вы садитесь разрабатывать архитектуру приложения, так, чтоб с заделом на будущее. Этот этап, пожалуй, самый ответственный и требует определённого времени  и анализа - это выделение сущьностей (классов), их взаимодействие (их интерплей), их интерфейса, критический анализ и разбор возможных решений, который бы позволил наименее безболезненно в будущем расширить функционал.  Вы, как главный архитектор, должны (нет, просто обязаны) предугодать возможность, что завтра, например, вдруг измениться стандарт (по вашей терменологии). Вот это всё продумывается N-ное время вдали от компьютера с ручкой  в руке и туевой хучей листов бумаги (нет, не туалетной). И вот на этой теоретической (не практической) стадии проектирования у вас в голове должно стрельнуть - ан нет, этот класс SomeCrap не отвечает нашим амбициозным требованиям.. Как бы нам его переделать, так, чтобы в случае чего мы могли применить к нему новый стандарт?

И вот случай с boost::tokenizer как раз иллюстрирует это) Его разработчики дали возможность конечным пользователям изменять его поведение, в определённых пределах, разумеется)

Я понимаю, что Ваш пример в достаточной степени абстрактный, но если предположить (а мне больше ничего не остаётся, поскольку нет иных сведений) что приватный метод CalculateSomeShit определяется особенностями текущего конкретно "стандарта" и подразумевается, что этот стандарт не сегодня-завтра может измениться, то, проводя "пальцевую" аналогию с boost::tokenizer его реализация могла бы быть следующей:

Код
C++ (Qt)
template <class T, class Standart>
class SomeCrab
{
public:
   T get_some_shit() const
   {
       T result = 0;
       result += Standart::CalculateSomeShit(m_shit_value);
       return result;
   }
private:
   T m_shit_value;
};
 
template <class T>
struct currennt_standart
{
   static T CalculateSomeShit(const T & x)
   {
       return sqrt(x*0.001);
   }
};
 
template <class T>
struct new_standart
{
   static T CalculateSomeShit(const T & x)
   {
       return cos(x)  + sin(x);
   }
};
 
SomeCrab<double, current_standart<double>> someCrab;
SomeCrab<double, new_standart<double>> newSomeCrab;
...
 
       
Всё.. От Вас требуется выделить, обозначить интерфейс тех минимальных частей (сущностей), которые полностью зависят от стандарта и предоставить возможность легко его модифицировать. Но здесь, конечно, тоже существует определённая грань - глупо пытаться состряпать  супер класс на все случаи жизни)    
« Последнее редактирование: Сентябрь 29, 2015, 17:40 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #116 : Сентябрь 29, 2015, 19:15 »

P.S. Кстати, вы эпохальное решение "финдреплейсера" видели? Попробуйте его расширить хоть как нибудь. Подмигивающий

Это кто такой, почему не знаю? Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #117 : Сентябрь 29, 2015, 19:24 »

Это кто такой, почему не знаю? Улыбающийся
Я про тот парсер, который был предложен Igors, в теме на которую ссылался m_ax.
А финдреплейсерами я называю почти все решения этого автора, уж очень ему функции findReplace с использованием QString удаются. Подмигивающий
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #118 : Сентябрь 29, 2015, 19:27 »

Цитировать
Я понимаю, что Ваш пример в достаточной степени абстрактный, но если предположить (а мне больше ничего не остаётся, поскольку нет иных сведений) что приватный метод CalculateSomeShit определяется особенностями текущего конкретно "стандарта" и подразумевается, что этот стандарт не сегодня-завтра может измениться, то, проводя "пальцевую" аналогию с boost::tokenizer его реализация могла бы быть следующей:

Ок, вы заменили наследование конструированием классов с помощью шаблонов. Конечно, для интерфейса с десятком методов типа get_some_shit() шаблон получится не маленьким (Игорь, не надо про говно Улыбающийся), но для небольших классов мы сами время от времени делаем что-то подобное.

Но возвращаясь к примерам выше - Вы исходите из того, что в Standart::CalculateSomeShit(m_shit_value); передается значение m_shit_value. В моем же случае Гугу даже этого решил избежать, и использование m_shit_value было им захардкожено в CalculateSomeShit(void) Грустный Я не уверен пока, что эту проблему можно разрешить подобным образом, не вижу пока хорошего варианта решения (ну, кроме "переделать все нафиг")...

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #119 : Сентябрь 29, 2015, 19:28 »

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

помоему, у вас тут противоречие.

Записан
Страниц: 1 ... 6 7 [8] 9 10 ... 16   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 23.