powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Критерий обратного сплитования
25 сообщений из 34, страница 1 из 2
Критерий обратного сплитования
    #38536142
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все знают, что повторные участки кода лучше выделить в отдельную единицу (переменную, функцию, класс, whatever...). Но вот такой вопрос: когда мы хотим доработать эту выделенную единицу, то как определить, нам лучше ввести параметр и этот код будет работать в двух режимах, или лучше нам сделать копипасту этой единицы и все, кто её используют пусть продолжают её использовать, а мы новую единицу допилим под новые требования и её будут юзать новые потребители. В чем может быть критерий для такого выбора?

Вот по аналогии, есть правило трех Фаулера: код можно копипастить, но только один раз, и если ты создаешь третью копию, тогда лучше выдели общий функционал в отдельную единицу. Тут криетрий классный и ясный - две копии (три экземпляра). А какой может быть критерий превращения общей отдельной единицы обратно в две разные копии с целью переделки одной из них, вместо дополнительной параметризации одной из них?
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536183
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВсе знают, что повторные участки кода лучше выделить в отдельную единицу (переменную, функцию, класс, whatever...). Но вот такой вопрос: когда мы хотим доработать эту выделенную единицу, то как определить, нам лучше ввести параметр и этот код будет работать в двух режимах, или лучше нам сделать копипасту этой единицы и все, кто её используют пусть продолжают её использовать, а мы новую единицу допилим под новые требования и её будут юзать новые потребители. В чем может быть критерий для такого выбора?

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

Я это обычно интуитивно понимаю. Новый параметр должен дополнять функционал, а не менять его... Например, если функция выбирает скин для сайта исходя из времени суток, а мы решили прикрутить ещё возможность выбора определённого набора скинов учитывая пол пользователя... а потом решили прикрутить выбор скина ещё и исходя из возраста... и потом... и т.д., то для всего этого правится всё тот же единственный метод для выбора скина... и создавать 10 разных методов для этого не логично (потом вспомни ещё где и что учитывается).

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

Скорее критерий можно выделить так: каждый метод должен отдавать строго форматированный результат (то есть без того, что бы "если ввёл 1, то на выход отдам массив, если 2, то количество одинаковых значений в этом массиве, если ввёл доп. параметр, то пускай это будет первый элемент массива класса Date"), а также нести чётко определённое смысловое значение. Также и для любого класса/структуры и т..д.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536190
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрЯ это обычно интуитивно понимаю.

А у меня психологический затык происходит вот в какой ситуации. Есть такая шняга как форма справочника. Это обычная форма, в ней таблица, заголовок, элементы управления: добавить, обновить, сохранить, фильтры... ну короче формочка-диалог-виджет. Эта формочка собирается из более мелких функций. Таблица, каждый контрол - все это отдельные функции. Колонки таблицы тоже функциями собираются. Ну источник данных - тоже функция.

Так вот почему же у меня идет жесточайшее внутреннее сопротивление создания единого общего компонента для этой формочки, чтобы на входе можно было задавать параметры, которыми эти формочки отличаются: источник данных, список колонок какие выводить, порядок и т.п. Почему же мы продолжаем на каком-то безотчетном чувстве создавать новые формы именно за счет копипасты? Почему даже когда мы создали этот общий компонент, то у нас возникает страх, что это ошибочный путь? Может потому что параметризация такого компонента составляет по объему кода 40% от самого компонента? Или может быть потому что сам общий компонент получился такой сложный, что всем проще копипастой, потому что этот копипастный компонент так легко читается с листа!

Может быть если объем параметризации становится слишком большим, то это признак вернуться обратно к копипасте?
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536191
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,
если после введения параметра программный объект реализует ту же абстракцию ( ха!:) ), что и раньше, то можно сделать параметр, если же - другую, то лучше копипастить.
Или вот другой критерий, на выбор: если для введения параметра требуются слишком большие изменения в программном объекте, а времени/сил/желания на это нет - то проще сделать копипаст, но тут уже ССЗБ.
Если код важный, лучше не лениться, а выделять общий код в отдельную единицу. За вторым режимом частенько следует третий, четвёртый, etc, и это тоже стоит учитывать при принятии решения.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536195
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixМожет потому что параметризация такого компонента составляет по объему кода 40% от самого компонента?что-то вы там у себя не до параметризовали.
Мы довели справочники вот до такого вот состояния:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/*!
	\file digOffices.h
*/
#ifndef DIGOffices_H
#define DIGOffices_H

#include "../../../framework/qt/forms/digest/digest_dll.h"
#include "../../../framework/qt/forms/digest/digDigest.h"

namespace digest {
class DIGEST_EXPORT Offices : public Digest
{
// константы
	//! стандартный sql запрос справочника
	static const QString sql_query;

// конструирование
public:
	//! конструктор
    explicit Offices( QWidget *parent = 0, int primaryKey = 0, QObject *extraData = 0 );
	//! деструктор
	virtual ~Offices() {}
// копирование и присваивание запрещены
private:
	Offices( const Offices & );
	Offices & operator=( const Offices & );

};	// class Offices

}	// namespace digest

#endif // DIGOffices_H


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
/*!
	\file digOffices.cpp
*/

#include "digOffices.h"

namespace digest {

// константы
const QString Offices::sql_query =
	"SELECT ID, Alias, Name FROM enterprise.Offices ORDER BY Alias;";

// конструирование
Offices::Offices( QWidget *parent, int primaryKey, QObject * ) : 
	Digest( "Offices", tr( "Офисы" ), QIcon( ":/digest/images/building.png" ), 
		"treasure_keeper", tr( "Новый офис" ), "enterprise.newOffice", tr( "Офис" ), "enterprise.editOffice", "enterprise.removeOffice", 
		parent, primaryKey )
{
	setTable( sql_query );

	setReadOnly( !checkAccessRights() );
}

}	// namespace digest

и тут бояться уже нечего, имхо ;)
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536208
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumix,
если после введения параметра программный объект реализует ту же абстракцию ( ха!:) ), что и раньше, то можно сделать параметр, если же - другую, то лучше копипастить.

У нас ситуация другая: производство абстрактного (общего) компонента связано с очень жирной и сложной параметризацией. При этом сам абстрактный компонент получается такой сложный, то потом читать его это просто полная жопамозга.

egorychИли вот другой критерий, на выбор: если для введения параметра требуются слишком большие изменения в программном объекте, а времени/сил/желания на это нет - то проще сделать копипаст, но тут уже ССЗБ.

Тут ещё знаете какой момент... форма справочника - это такая шняга, которая даже если никогда не изменится, то у неё все равно остается очень высокая вероятность, что завтра появится какая-то идея и кто-то захочет у какого-то справочника что-то там кастомно подсвечивать или какую-то ещё хрень придумают... и если это все будет крутиться под абстрактным компонентом, то самая идея вносить эти изменения будет очень больно... а внести в конкретнную копипасту - всё проще.

Попадалово с копипастами - это если в них во все что-то надо сразу внести новое одновременное. Тогда будет много ручной работы. Но я сейчас думаю может эту проблему как-то исхитриться решить за счет плагинов-хуков, потому что ведь эти копипастные компоненты все собираются из других компонентов, которые уже являются абстракциями. Например, кнопка обновить или кнопка добавить. Используются renderButtonAdd(), renderButtonUpdate(), а вот их расположение уже задается в каждой копипасте отдельно, что позволяет в одном справочнике add, up, а в другом up, add, в а третьем up, add, close и т.д.

Опять же знаете, во многих программных продуктах например модели для данных генерят с помощью скелетов на основе схемы данных. А это ведь копипаста, хоть и автоматная. Значит копипаста не всегда вне закона. Вот где критерий только?

egorychЕсли код важный, лучше не лениться, а выделять общий код в отдельную единицу. За вторым режимом частенько следует третий, четвёртый, etc, и это тоже стоит учитывать при принятии решения.

Тут не про лень, а про затраты / выхлоп. В данный момент, мне кажется, проще потратить 30 минут на копипасту с тестированием, чем ломать мозг до крови 2 дня, чтобы создать сложнейший абстрактный компонент на все варианты параметров.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536212
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychLumixМожет потому что параметризация такого компонента составляет по объему кода 40% от самого компонента?что-то вы там у себя не до параметризовали.


Знаете есть такой подход, параметризация объектом.

new A(new AConf())

Так вот тут речь о ситуации, когда у AConf такой интерфейс, то понимание как работает код внутри А - это просто смерть! И когда ты сидишь и заполняешь параметризатор для очередной формы, ты вдруг думаешь: ёпрст, проще руками. То есть из-за того, что происходит существенный попил частей алгоритма между двумя сторонами: условно половина алгоритма в абстракции, а другая часть в конкретике, то попытка отладить работу этой конструкции превращается в ад и младшие кодеры просто уходят в прокрастинацию и страх. При этом копипастные алгоритмы, где ту же саму параметризацию приходится делать тупо за счет обычной замены например было companyId а заменили на lobbyId и т.д. то есть параметризация отрывает глаз от контекста и заполняя параметры младшие кодеры перестают видеть а что именно делает этот параметр, тогда как в копипасте они видят весь процесс целиком.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536215
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока писал ответ ещё такая мысль пришла в голову. Похоже, что существует два типа параметров: параметры, которые вынуждают тебя понимать алгоритм абстрактного (общего) компонента и есть параметры, которые от тебя такого понимания не требуют. Как вам идея критерия: если параметр требует от тебя понимания алгоритма внутри компонента, тогда пользуйся копипастой.

user()->get(id);

Тут мне похер как оно будет доставаться, поэтому это может быть абстрактный компонент.

user()->get(id, fatFilter, frameLimit, isUsedOnce)

То тут наверное лучше копипастой, потому что хер знает что эти параметры делают и какие сюрпризы они нам могут подарить.

Как идейка?
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536285
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не теоретик, программлю редко и по мелочи, и в подобных случаях обычно поступаю так:
- Если вновь вводимый параметр обязан иметь значение, это повод "размножить" код на копии.
- Если же он может быть опущен (или ему может быть присвоено вполне определённое значение по умолчанию - прямо в коде), можно надставить код.
Причина такого подхода элементарна - нет необходимости искать использование этого кода с целью изменения обращений к нему в соответствии с новым набором параметров.
Кстати, а к какому из двух твоих вариантов отнести написание "обёртки", работающей с дополнительными параметрами и вызывающей исходный код без его коррекции? тоже ведь бываемый вариант...
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536326
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
LumixТак вот почему же у меня идет жесточайшее внутреннее сопротивление создания единого общего компонента для этой формочки, чтобы на входе можно было задавать параметры, которыми эти формочки отличаются: источник данных, список колонок какие выводить, порядок и т.п.

Вы можете привести псевдокод для этой функции с параметрами (и описанием их типов)?

Может быть это больше похоже на объект, чем на функцию?
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536333
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
LumixТо тут наверное лучше копипастой, потому что хер знает что эти параметры делают и какие сюрпризы они нам могут подарить.

Как идейка?

Мне названия параметров ничего не говорят. Расшифруйте.
В идеале интерфейс функии не должен требовать понимания ее реализации.



Прочитайте про принципы SOLID.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536627
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решает патерн визитор , есть определенные недостатки , но при проявлении смекалки архитектором приложения они обходятся.

Это базовый патерн для создания универсального конечного автомата с и иерархией детализации параметров и логичной смены поведения поведения обьектов в зависимости от обстоятельств.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536666
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixТут ещё знаете какой момент... форма справочника - это такая шняга, которая даже если никогда не изменится, то у неё все равно остается очень высокая вероятность, что завтра появится какая-то идея и кто-то захочет у какого-то справочника что-то там кастомно подсвечивать или какую-то ещё хрень придумают... и если это все будет крутиться под абстрактным компонентом, то самая идея вносить эти изменения будет очень больно... а внести в конкретнную копипасту - всё проще.
Почитал и не понял почему наследование не используется? По хорошему должна быть целая иерархия классов.
Сделал класс "Стандартный справочник" а для извращенных случаев создал на его основе класс "Справочник с извращениями" и в нем дописал подсвечивание и т.п.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38536845
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПочитал и не понял почему наследование не используется? По хорошему должна быть целая иерархия классов.
Сделал класс "Стандартный справочник" а для извращенных случаев создал на его основе класс "Справочник с извращениями" и в нем дописал подсвечивание и т.п.

Отличный пример.

Вопрос звучит так: зачем для "создания справочника с извращениями" наследоваться от "стандартный справочник". Наша практика показывает, что для того, чтобы подготовить класс "стандартный справочник" к форме, пригодной для наследования, код этого "стандартного справочника" становится извращенным и когда от него ещё и извращенческий справочник наследуется, то тогда вообще жопа полная наступает. Особенно когда это ещё этот код открывает младший кодер.

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

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

В этом случае у меня возникает теоретический вопрос: что нам мешало сделать вместо двух справочников сделать один мега-справочник, но который в зависимости от параметра mode отдавал бы просто справочник или справочник с извращениями.

Мы для себя пытаемся на этот вопрос ответить так: если бы мы сделали один мега-справочник, отдающий по параметру режима, то в итоге получился бы сложночитаемый код и если бы мы захотели добавить ещё какую-то шнягу, то это привело бы к боли в анусе.

В данный момент, если захочется сделать какой-то справочник с извращениями третьего типа, то мы просто копипастим или стандартный справочник или справочник с извращениями, в зависимости от того, кто из них ближе по составу и делаем третий класс "справочник с извращениями 2", в итоге у нас получается три класса справочников, которые не являются наследниками, но если "прищуриться", то можно заметить, что все они связаны копипастой в прошлом.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537035
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВопрос звучит так: зачем для "создания справочника с извращениями" наследоваться от "стандартный справочник". Наша практика показывает, что для того, чтобы подготовить класс "стандартный справочник" к форме, пригодной для наследования, код этого "стандартного справочника" становится извращенным и когда от него ещё и извращенческий справочник наследуется, то тогда вообще жопа полная наступает. Особенно когда это ещё этот код открывает младший кодер.
Не надо туда младшим лазить. Нечего ему там делать, разве что поизучать для общего развития. В коде "стандартного справочника" должно быть все одинаково общеиспользуемое в справочниках. Если нормально написан класс "стандартный справочник" то лазить в него нет необходимости. Разве что новую фичу добавить.

LumixВ этом случае у меня возникает теоретический вопрос: что нам мешало сделать вместо двух справочников сделать один мега-справочник, но который в зависимости от параметра mode отдавал бы просто справочник или справочник с извращениями.
Тогда уже старшему кодеру станет проблематично сопровождать этот мега-код. И цена ошибки возрастает, т.к. любое исправление касается сразу всех справочников.

LumixВ данный момент, если захочется сделать какой-то справочник с извращениями третьего типа, то мы просто копипастим или стандартный справочник или справочник с извращениями, в зависимости от того, кто из них ближе по составу и делаем третий класс "справочник с извращениями 2", в итоге у нас получается три класса справочников, которые не являются наследниками, но если "прищуриться", то можно заметить, что все они связаны копипастой в прошлом.
Если подитожить, то есть плюсы и минусы в обоих подходах, причем минусы одного это плюсы другого.
Плюсы копипаста: читабельность кода и последствия ошибки меньше (накосячил в одном справочнике - остальные не пострадали).
Плюсы иерархии: простота доработки общего функционала для всех справочников, не надо лезть во все формы копипастить туда новый код. Неизвестно что завтра потребуется добавить.

Поэтому надо искать какую-то золотую середину.

Лично у меня иерархия. Я на фоксе пишу и там с форми есть такая особенность что класс это по сути базовый класс, а конечный класс это форма. Унаследовать от формы невозможно. Т.е. у меня есть базовый класс "Справочник" и куча форм для каждого конкретного справочника, причем внутри большинства форм даже кода нет ни строчки, только настройки: таблица источник, колонки, размеры и т.п. Внутри класса абстрактный чудо-код, который самому тяжело понимать, но он не напрягает, т.к. править его нет необходимости. Лично мне наоборот удобнее что нет ничего лишнего в конечной форме, только код касающийся конкретного справочника. Удобнее смотреть на пару десятков строк по существу, чем на теже пару десятков в сотнях строк общего кода.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537125
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Lumix[Опять же знаете, во многих программных продуктах например модели для данных генерят с помощью скелетов на основе схемы данных. А это ведь копипаста, хоть и автоматная.

Это не копипаста, так как в данном случае сгенеренное не является исходным языком, а промежуточным.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537176
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВ данный момент, если захочется сделать какой-то справочник с извращениями третьего типа, то мы просто копипастим или стандартный справочник или справочник с извращениями, в зависимости от того, кто из них ближе по составу и делаем третий класс "справочник с извращениями 2", в итоге у нас получается три класса справочников, которые не являются наследниками, но если "прищуриться", то можно заметить, что все они связаны копипастой в прошлом.

Специально для таких как вы ( формальзованного решения подобного рода задач),
когда то была придумана реляционная модель , сурагатные ключи
и прочая формализованная теория и практика, которая легла в основу языка SQL .
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537229
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаР,

А каким образом суррогатные ключи связаны с добавлением параметра в метод(функцию)?
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537238
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Так вот почему же у меня идет жесточайшее внутреннее сопротивление создания единого общего компонента для этой формочки, чтобы на входе можно было задавать параметры, которыми эти формочки отличаются: источник данных, список колонок какие выводить, порядок и т.п. Почему же мы продолжаем на каком-то безотчетном чувстве создавать новые формы именно за счет копипасты? Почему даже когда мы создали этот общий компонент, то у нас возникает страх, что это ошибочный путь? Может потому что параметризация такого компонента составляет по объему кода 40% от самого компонента? Или может быть потому что сам общий компонент получился такой сложный, что всем проще копипастой, потому что этот копипастный компонент так легко читается с листа!

Может быть если объем параметризации становится слишком большим, то это признак вернуться обратно к копипасте?

Может просто настало время для большого рефакторинга?
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537277
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBezДохтаР,

А каким образом суррогатные ключи связаны с добавлением параметра в метод(функцию)?


Сурагатный ключ , это аналог ссылки на экземпляр обьекта.

3 нормальная форма с сурагатными ключами покрывает 90% требуемого Lumix -у функционала
работы со сложными справчниками, но не копипастой кода и прочими вело-извращениями,
а формализованными аппаратом реляционной модели доступа к данным.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537357
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе надо туда младшим лазить. Нечего ему там делать, разве что поизучать для общего развития. В коде "стандартного справочника" должно быть все одинаково общеиспользуемое в справочниках. Если нормально написан класс "стандартный справочник" то лазить в него нет необходимости. Разве что новую фичу добавить.

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

Я вот ещё что сегодня понаблюдал на эту тему.

Когда мы используем копипасту, то у нас в копипасте всегда есть места, которые мы изменяем. Ведь с этой целью мы и копипастим.

Так вот создание общего компонента на самом деле происходит точно так же, только в этих заменяемых точках вместо новых значений, прописываются параметры, которые потом подцепляются к входу параметризации.

например

Код: javascript
1.
2.
print("Привет" + 1)
print("Пока" + 1) // копипаста



то же самое на общем компоненте

Код: javascript
1.
2.
3.
print("Привет" + 1)
function commonPrint(txt){ print(txt + 1); }
commonPrint("Пока"); // общий компонент вместо копипасты



то есть внешний компонент основан на той же самой точке изменения.

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

Поэтому вопрос: оставлять общий компонент или распилить его на копипасты как-то связан с парметризационным месивом, когда из-за всех этих свичей, ифов и циклов параметризации теряется сам рабочий алгоритм, который тоже состоит из свичей, ифов и циклов.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537422
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixПриключения начинаются когда меняется функционал, а он у нас может добавляться, удаляться или варироваться. И тут у нас в общем компоненте появляются условные блоки и свичи. Именно эти условные блоки превращают абстрактный код в сложночитаемое месиво, особенно когда там пять вложенных циклов и десять разных интерфейсов для данных.
мы говорим про справочники или обо всем на свете?
я не зря выделил слово "одинаково"
Dima TВ коде "стандартного справочника" должно быть все одинаково общеиспользуемое в справочниках.
Что можно дописывать например в коде кнопки "Добавить" ? Там вызов формы правки новой записи. Это никак ни от чего не зависит, и никогда не поменяется. Зачем этот код копипастить ? А код может быть не простым. Например у меня все формы правки независимы, т.е. можно добавлять одновременно сколько угодно записей, поэтому код не одна строчка, и операция сохранения не тривиальна, т.к. по закрытию форма правки должна вызвать родительскую форму (с гридом), вывести ее на первый план, отрефрешить чтоб новый элемент появился и встать на него. Это тоже прописывать в каждую форму?

Можно конечно сказать если изначально все правильно сделано то оно скопипастится и не потребует доработок. Но кто сказал что изначально все правильно сделано? Понимание того "как правильно" приходит после окончания разработки, а при копипасте исправлять такие косяки проблематично. Например у меня есть свой класс грида, все остальные производные от него, изначально я заложил туда весь полезный (как я считал на тот момент) функционал сверх стандартного, но через пять лет понял что классная фича скопировать все содержимое грида в буфер обмена чтоб потом вставить в эксель например, час работы, перекомпиляция и все мои гриды по правой кнопке копируют свое содержимое в буфер обмена. А с копипастом я бы перелопачивал все написанное за пять лет.

На мой взгляд главный принцип ООП это повторное использование кода (не путать с созданием нескольких однотипных объектов во время работы программы), вот к этому и надо стремится, чтоб одинаковый код был написан в одном месте, а не размножен копипастом. И не надо бросаться в другую крайность в попытке один раз написать код на все случаи жизни. Ты хорошо процитировал
Lumixесть правило трех Фаулера: код можно копипастить, но только один раз, и если ты создаешь третью копию, тогда лучше выдели общий функционал в отдельную единицу.
Я этого Фаулера никогда не читал, но именно так и делаю как он предложил, сам догадался.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537447
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tмы говорим про справочники или обо всем на свете?

Мы обсуждаем общетеоретическую концепцию копипаст vs абстракция, но на примере справочников.

Dima TЧто можно дописывать например в коде кнопки "Добавить" ? Там вызов формы правки новой записи. Это никак ни от чего не зависит, и никогда не поменяется.

Какой вы наивный! Даже в таком малюсеньком элементе может дохера что поменяться. Не говоря уже о расположении и показа этой кнопки в зависимости от тех или иных условий. Кнопка может стать иконкой, а может на Ctrl повешают дополнительный функционал, ещё к ней можно прикрутить контекстное меню с опциями создания. Там можно такой зоопарк устроить, то мама не горюй 2: первая кровь.

Dima TЗачем этот код копипастить ?

Если что, то кнопка добавления реализована в виде отдельной функции, принимающей параметры.

Dima TА код может быть не простым. Например у меня все формы правки независимы, т.е. можно добавлять одновременно сколько угодно записей, поэтому код не одна строчка, и операция сохранения не тривиальна, т.к. по закрытию форма правки должна вызвать родительскую форму (с гридом), вывести ее на первый план, отрефрешить чтоб новый элемент появился и встать на него. Это тоже прописывать в каждую форму?

Ну там разные случаи бывают и зоопарк тоже разный бывает.

Dima TМожно конечно сказать если изначально все правильно сделано то оно скопипастится и не потребует доработок.

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

Я пока только не знаю как это теоретически обосновать. Пока это чистая эмпирика.

Dima TНо кто сказал что изначально все правильно сделано?

У нас нет термина правильно / неправильно, мы пользуемся термином "вероятность, что потребуется изменение".

Dima TПонимание того "как правильно" приходит после окончания разработки, а при копипасте исправлять такие косяки проблематично.

У нас нет понятия окончание разработки, мы же не в геймдеве, хотя и у них уже постепенно такой термин отходит на второй план. Есть только понятие, что некий элемент просто незачем будет менять. Но по факту, чисто статистически в эту неизменяемую касту очень мало чего попадает. В интерфейсах вообще самая высокая вероятность волатильности требований.

Dima TНапример у меня есть свой класс грида, все остальные производные от него, изначально я заложил туда весь полезный (как я считал на тот момент) функционал сверх стандартного, но через пять лет понял что классная фича скопировать все содержимое грида в буфер обмена чтоб потом вставить в эксель например, час работы, перекомпиляция и все мои гриды по правой кнопке копируют свое содержимое в буфер обмена. А с копипастом я бы перелопачивал все написанное за пять лет.

Пример тухлый, потому что у нас бы за 5 лет накопилось 186 видов разных гридов, а если бы мы спихали бы их один грид и это все управлялось бы параметрами, то потом в этом гриде вообще ни один человек не смог бы разобраться, не уронив все остальные.

Есть такое правило: чем более абстрактный компонент, тем больше он режет вариативность, тем больше он вводит стандартности всякие. А чем больше абстрактный компонент может переваривать всякую разную вариативность, тем больше он по форме стремится к тому, что его перестанет понимать даже сам разработчик.

Dima TНа мой взгляд главный принцип ООП это повторное использование кода (не путать с созданием нескольких однотипных объектов во время работы программы), вот к этому и надо стремится, чтоб одинаковый код был написан в одном месте, а не размножен копипастом.

Код предназначенный для реюза в условиях высокой степени волатильности становится непонятным даже для автора этого кода. Когда непараметризированная версия грида 67 варианта занимает 80 строчек, а абстрактный грид на 183 вида с 340 параметрами состоит из 2800 строчек. Вот в чем жопа.

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


Dima TИ не надо бросаться в другую крайность в попытке один раз написать код на все случаи жизни.

А это и не получится. Ума не хватит. Крыша съедет, прежде чем закончишь. А если и закончишь, обслуживать этого монстра будет некому.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537484
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё набрел на такое интересное явление - называется сниппет (snippets). Судя по описанию это как раз некие участки кода, типа шаблонов, которые предназначены для размножения именно копипастой.

То есть похоже, что программный код "легализованный" для копипасты официально не просто приемлим, а даже имеет свое название - сниппеты.
...
Рейтинг: 0 / 0
Критерий обратного сплитования
    #38537770
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixто как определить, .. или лучше нам сделать копипасту
Если коротко, то копипаста оправдана только при наличии трудноустранимого недостатка в дизайне (класса, инструмента, языка программирования итп), когда является локально меньшей из зол. Скажем, когда-то, много лет назад, когда ещё не было шаблонов, у меня была утилитка, которая генерировала файл "по образцу", подставляя в него нужное название типа (по сути, имитировала Class<T>). Такие подходы порой растут до идиотских дивных вершин, но нужно хорошо понимать, что это всё таки костыльные решения над убогой архитектурой (ну или - что чаще - убогие костыльные решения над архитектурой, где можно было бы сделать нормально).

Lumixи все, кто её используют пусть продолжают её использовать, а мы новую единицу допилим под новые требования и её будут юзать новые потребители. В чем может быть критерий для такого выбора?
Ну, копипаста точно не является нормальным выбором в таком случае. Нормальным выбором может быть наследование (кто использует - использует старый класс, кому нужно - допиленный наследник), может быть обобщение (кто использует - продолжает использовать метод с тремя параметрами, а тот вызывает полную версию с пятью) итп.

Впрочем, сам по себе такой выбор сомнителен. Если предыдущая работа сделана правильно, то как правило, нужно чтобы "кто использует, пусть использует улучшенную версию".
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Критерий обратного сплитования
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]