ООП vs процедурное программирование - страница 27

 
Реter Konow:
В функционально-процедурном программировании, проблем с доступом описанных тобой не существует. Без перегрузки функций, без полей и обьектов, без указателей и прочего, когда у тебя только одна память для всех глобальных переменных к которым ты можешь обращатся отвсюду, как может вызватся не та функция? Какие ошибки связанные с доступом могут возникнуть? Да и запоминать все в разы легче.

Да ошибка простейшая - обратиться не к той переменной, содержащей близкое по величине значение.

Такая ошибка может быть не выявлена очень долго, но, по закону подлости - "вылезет" она как раз в то время, когда безошибочная работа в этом месте была бы очень нужна !

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

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

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

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

 
George Merts:

Да ошибка простейшая - обратиться не к той переменной, содержащей близкое по величине значение.

Такая ошибка может быть не выявлена очень долго, но, по закону подлости - "вылезет" она как раз в то время, когда безошибочная работа в этом месте была бы очень нужна !

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

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

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

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

Блин, ну как можно обратится не к той переменной, если они все по разному называются? Как может вызватся не та функция, если у нее уникальное имя и перегрузки нет? Внутри массива ядра все индексы ячеек названы дефайнами человеческими словами. Что здесь можно перепутать? Пойми, проблем о которых ты говоришь не существует ВООБЩЕ.


В памяти я держу только структуру ядра, которая очень проста. Также я знаю перечень свойств обьектов. Свойства у всех объектов одинаковые, только значения разные. Всего 140 свойств, но в памяти держу только самые важные, штук 30. Остальные вспоминаю когда нужно. Захожу для это в файл с дефайнами и смотрю полный список свойств. Ничего сложного. Глобальные переменные в фокусе, как например "ОБЬЕКТ" или "ОКНО" вообще запонинать не нужно. И перепутать ни с чем невозможно.

У моих переменных осмысленные названия на русском языке. Перепутать что либо можно только после бурной вечеринки.))
 

Мои глобальные переменные - это переменные используемые в фокусе, который "нацелен" на ядро и перемещается по нему при перемещении курсора.

Например: переменная "ОКНО" постоянно несет в себе номер того окна, на котором находится курсор. Переменная "ОБЪЕКТ" - номер того объекта на котором находится курсор.

Через них я обращаюсь к ядру, - к конкретному окну, объекту и свойству в ядре - G_CORE[ОКНО][ОБЪЕКТ][_NAME] или G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_GROUP]. В любой функции, если мне нужна Х-координата объекта то я ее беру из G_CORE[ОКНО][ОБЪЕКТ][_X], если высота объекта - из G_CORE[ОКНО][ОБЪЕКТ][_Y_SIZE] и тд... 


Всего у меня около сотни отдельно объявленных глобальных переменных, но в глобальном массиве ядра их тысячи, ведь каждая ячейка массива - это переменная. Однако, управлятся с этим количеством переменных очень легко, потому что они упорядочены. Каждое окно в ядре - это поле массива, каждый ряд - это один объект, который состоит из 140 свойств. Элементы в данном случае, - это наборы объектов. У каждого элемента есть главный объект, в котором записаны главные свойства всего элемента. Объекты принадлежащиее конкретному элементу связаны между собой специальными индексами, поэтому какой бы объект не попал в фокус, элемент которому он принадлежит тоже попадает в фокус. Также и канвас на котором он нарисован. Благодаря четкой архетиктуре ядра и прямому доступу из любой функции, я могу управлять тысячами переменных которые из себя представляют ячейки массива ядра, ничего не забывая и свободно ориентируясь.

 
СанСаныч Фоменко:

Совершенно бессмысленный разговор: нет критерия отнесения кода к "хорошему" или "плохому". Именно поэтому не ясно про ООП.

Для меня таким критерием является  НАГЛЯДНОСТЬ кода, которая проявляется в том, что автор или сторонний человек через довольно большой промежуток времени сможет прочесть код и его использовать для модификации, поиска багов.....


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

Второй пример выше George Merts

Когда наглядный код после отладки был заменен на НЕ наглядный. По моему критерию качественный код (легко читался) был заменен на недопустимый для меня.


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


Ну с СС все ясно. Все, что выше уроdня его понимания, является ненаглядным. Зато он знает букву R ))))))))))))))

 
Alexey Volchanskiy:

Ну с СС все ясно. Все, что выше уроdня его понимания, является ненаглядным. Зато он знает букву R ))))))))))))))

К ООП добавлю еще и китайский, можно японский...

Зачем ООП? ЧТО будет лучше?

Наглядность - это упрощение отладки, модификации. Наглядность проистекает из тщательного проектирования программы, из структурирования на ФУНКЦИИ, а не на ОБЪЕКТЫ, потому что весь мир устроен на действиях над объектами, но не наоборот.

Когда разбивка на функции вытекает из последовательности преобразования входных данных в выходные. Например, преобразование котира на входе в выходные данные BUY|SELL возможно только через указание ДЕЙСТВИЙ.

Именно так устроено мышление человека.


ПС.

По поводу Вашего замечания про R.

Желаете поерничать?

Отвечаю крайне редко, но могу и ответить 

 
Реter Konow:

Блин, ну как можно обратится не к той переменной, если они все по разному называются? Как может вызватся не та функция, если у нее уникальное имя и перегрузки нет? Внутри массива ядра все индексы ячеек названы дефайнами человеческими словами. Что здесь можно перепутать? Пойми, проблем о которых ты говоришь не существует ВООБЩЕ.

Ну, вот у меня была пара таких случаев.

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

Реter Konow:

В памяти я держу только структуру ядра, которая очень проста. Также я знаю перечень свойств обьектов. Свойства у всех объектов одинаковые, только значения разные. Всего 140 свойств, но в памяти держу только самые важные, штук 30. Остальные вспоминаю когда нужно. Захожу для это в файл с дефайнами и смотрю полный список свойств. Ничего сложного.

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

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

 
George Merts:

Ну, вот у меня была пара таких случаев.

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

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

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


Ну, говоря откровенно я помню очень много всего. Чего стоят только одни абрравиатуры привязок обьектов _X2X, Y2Y, B2B, R2R, H2Y, W2X, Y2H, X2W, C2C и т.д... каждая определяет положение одного обьекта относительно другого. Они находятся в параметрах A1,B1,C1,A2,B2,C2,A3,B3,С3,А4,В4,С4,А5...  Также помню пару десятков названий категорий и подкатегорий обьектов, еще пару десятков свойств окон (их более 100).  В блоке построения например, находятся десятки функций, и занимают более 4000 строк кода. Приходится ориентироватся и помнить очень много. Но запоминание возникает от длительной практики, не сразу, а постепенно. Раньше у меня голова пухла от количества сущностей и размеров кода, но потом все утрамбовалось и стало просто. 

 
Реter Konow:

Ну, говоря откровенно я помню очень много всего. Чего стоят только одни абрравиатуры привязок обьектов _X2X, Y2Y, B2B, R2R, H2Y, W2X, Y2H, X2W, C2C и т.д... каждая определяет определенное положение одного обьекта к другому, находятся в параметрах A1,B1,C1,A2,B2,C2,A3,B3,С3,А4,В4,С4,А5...  Также помню пару десятков названий категорий и подкатегорий обьектов, еще пару десятков свойств окон (их более 100).  В блоке построения например, находятся десятки функций, и занимают более 4000 строк кода. Приходится ориентироватся и помнить очень много. Но запоминание возникает от длительной практики, не сразу, а постепенно. Раньше у меня голова пухла от количества сущностей и размеров кода, но потом все утрамбовалось и стало просто. 


отвлечься, забыв обо всём уехать на месяц в отпуск, не думая о коде. После приехать, увидеть все эти а1, б1 и т.д. и забиться в истерике :)

 
Alexey Oreshkin:

отвлечься, забыв обо всём уехать на месяц в отпуск, не думая о коде. После приехать, увидеть все эти а1, б1 и т.д. и забиться в истерике :)

Для примера, - вот что представляет из себя элемент "чекбокс" в прото-ядре:

_OBJECTS_SET, CHECKBOX,
//============================================================================================================================================================================================================================================================================================================================================================================================================================================
//------------T------X----Y----W-----H----B_TYPE-- MOB---PXL-----------G-----C------SG---SC--OBJSCR--NEUTRAL-----------A1--B1--C1-----------A2----B2--C2----------A3----B3--C3--------A4--B4--C4-------OBH--OBI--C5--D5--E5--------------------------------------------------------------------------------------------------------------ACT-STATUS--CURRENT-----CURRENT---LAST--------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Основание чекбокса--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_NEW_OBJECT,  5,     0,   0,   200,  17,  _STRIP,  _CNVS,    0,    _aq1,CHECKBOX,   0,_MOB,   0,    _aq1,  _NS_gr1,   A1,  _C2C,_CNVS, 0,  A2,  _C2C,_CNVS, 0,    A3,_W2T, _aq3,  30,      A4,  0, 0,  0,    A5,0,  0,  0,  0,  0,   A6,  0,      A7, 1,    _aq1, CHECKBOX,        0,        0,        0,        0,        0,      0,       0,       0,         0,         0,       0,       0,   A8,  0,  0,  0,   A9, _OBJECT_RELEASED, _NS_gr1,  0,  0,  0,    0,    0,    0,   _PL_END,
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Лейбл чекбокса--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_NEW_OBJECT,  5,     0,    0,   0,    0, _LABEL,  _CNVS,    0,    _aq2,CHECKBOX,   0,   0,   0,    _aq1,  _NS_gr3,   A1,  _X2X,_aq1, 0,   A2,  _Y2Y,_aq1,   0,    A3,  0,  0,   0,      A4,  0, 0,  0,      A5,0,_CHECKBOX_OFF, 0,  0,  0,   A6,  0,    A7, 2,    _aq1,        0,        0,        0,        0,        0,    0,      0,       0,       0,         0,         0,       0,       0,       A8,  0,  0,  0,  A9, _OBJECT_RELEASED, _NS_gr4,  _CHECKBOX_ON,  0,  0,   _NS_gr5,   _NS_gr6,    _NS_gr7,   _NS_gr7, _PL_END,
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Наименование чекбокса--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_NEW_OBJECT,  5,     0,    0,   0,    0, _TEXT_,  _CNVS,    0,    _aq3,CHECKBOX,_OCN,   0,   0,    _aq1,  _NS_gr2,   A1,  _X2X,_aq1, 25,   A2,  _Y2Y,_aq2,   2,    A3,  0,  0,   0,      A4,  0, 0,  0,     A5,0,  0,  0,  0,  0,   A6,  0,              A7, 3,    _aq1,        0,        0,        0,        0,        0,    0,      0,       0,       0,         0,         0,       0,       0,       A8,  0,  0,  0,   A9, _OBJECT_RELEASED, _NS_gr2,  0,  0,  0,    _NS_gr9,    _NS_gr9,    _NS_gr10,   _NS_gr10,    _PL_END,
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_END_,
//============================================================================================================================================================================================================================================================================================================================================================================================================================================

//_NEUTRAL_STATE
//====================================================================================================================================================================================================================================================
//             X           Y        PIXEL_0     ALFA_0     PIXEL_1      ALFA_1    PIXEL_2     ALFA_2     PIXEL_3     ALFA_3       PIXEL_4     ALFA_4      PIXEL_5     ALFA_5        PIXEL_6     ALFA_6    PIXEL_7     ALFA_7
//====================================================================================================================================================================================================================================================
_NS_gr1,       0,          0,         0,         0,         -1,         -1,        -1,        -1,         -1,         -1,          -1,        -1,          -1,         -1,           -1,         -1,         -1,        -1,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//====================================================================================================================================================================================================================================================

//==========================================================================================================================================================================================================================================
//-------------X-----------Y--------TEXT COLOR-----TEXT_ALFA   FONT----FONT SIZE-----ANGLE------POSITION----------STYLE---------------------------------------------------------------------------------------------------------------------------------------       
//==========================================================================================================================================================================================================================================
_NS_gr2,     0,          0,           clrBlack,        255,      1,      10,         0,     TA_LEFT|TA_TOP,    FW_NORMAL,        -1,         -1,         -1,          -1,      -1,         -1,        -1,           -1,        -1,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//=======================================================================================================================================================================================================================================
//==========================================================================================================================================================================================================================================
//-------------X-----------Y--------TEXT COLOR-----TEXT_ALFA   FONT----FONT SIZE-----ANGLE------POSITION----------STYLE---------------------------------------------------------------------------------------------------------------------------------------       
//==========================================================================================================================================================================================================================================
_NS_gr9,     0,          0,           clrBlue,        155,      1,      10,         0,     TA_LEFT|TA_TOP,    FW_NORMAL,        -1,         -1,         -1,          -1,      -1,         -1,        -1,           -1,        -1,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//=======================================================================================================================================================================================================================================
//==========================================================================================================================================================================================================================================
//-------------X-----------Y--------TEXT COLOR-----TEXT_ALFA   FONT----FONT SIZE-----ANGLE------POSITION----------STYLE---------------------------------------------------------------------------------------------------------------------------------------       
//==========================================================================================================================================================================================================================================
_NS_gr10,     0,          0,       C'150,150,150',     255,      1,      10,         0,     TA_LEFT|TA_TOP,    FW_NORMAL,        -1,         -1,         -1,          -1,      -1,         -1,        -1,           -1,        -1,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//=======================================================================================================================================================================================================================================


//LABEL _NEUTRAL_STATE
//====================================================================================================================================================================================================================================================
//             X           Y        PIXEL_0     ALFA_0     PIXEL_1      ALFA_1       PIXEL_2     ALFA_2        PIXEL_3     ALFA_3         PIXEL_4       ALFA_4           PIXEL_5     ALFA_5        PIXEL_6     ALFA_6    PIXEL_7     ALFA_7
//====================================================================================================================================================================================================================================================
_NS_gr3,       0,          0,    C'255,255,255',  255,   C'253,253,253',  255,     C'80,80,80',  255,        C'140,140,140', 255,       C'200,200,200',   255,        C'245,245,245',  255,    C'240,240,240',  255,       0,     0,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//====================================================================================================================================================================================================================================================

//LABEL _ACTIVATED_STATE
//====================================================================================================================================================================================================================================================
//             X           Y        PIXEL_0     ALFA_0     PIXEL_1      ALFA_1       PIXEL_2     ALFA_2        PIXEL_3     ALFA_3         PIXEL_4       ALFA_4           PIXEL_5     ALFA_5        PIXEL_6     ALFA_6   PIXEL_7     ALFA_7
//====================================================================================================================================================================================================================================================
_NS_gr4,       0,          0,    C'255,255,255',  255,   C'253,253,253',  255,     C'80,80,80',  255,        C'140,140,140', 255,       C'200,200,200',   255,        C'245,245,245',  255,    C'240,240,240',  255,       0,      0,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//====================================================================================================================================================================================================================================================

//_OBJECT_NEUTRAL_HIGHLIGHTED
//====================================================================================================================================================================================================================================================
//             X           Y        PIXEL_0     ALFA_0     PIXEL_1      ALFA_1       PIXEL_2     ALFA_2        PIXEL_3     ALFA_3         PIXEL_4       ALFA_4           PIXEL_5     ALFA_5        PIXEL_6     ALFA_6    PIXEL_7     ALFA_7
//====================================================================================================================================================================================================================================================
_NS_gr5,       0,          0,    clrWhite,   255,         clrWhite,     255,     C'80,80,80',  255,        C'140,140,140', 255,       C'200,200,200',   255,        C'245,245,245',  255,    C'240,240,240',  255,       clrBlue,      255,          _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//====================================================================================================================================================================================================================================================

//_OBJECT_ACTIVATED_HIGHLIGHTED
//====================================================================================================================================================================================================================================================
//             X           Y        PIXEL_0     ALFA_0     PIXEL_1      ALFA_1       PIXEL_2     ALFA_2        PIXEL_3     ALFA_3         PIXEL_4       ALFA_4           PIXEL_5     ALFA_5        PIXEL_6     ALFA_6    PIXEL_7     ALFA_7
//====================================================================================================================================================================================================================================================
_NS_gr6,       0,          0,    C'255,255,255',  255,   C'253,253,253',  255,     C'80,80,80',  255,        C'140,140,140', 255,       C'200,200,200',   255,        C'245,245,245',  255,       C'240,240,240',   255,      clrBlue,      255,         _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//====================================================================================================================================================================================================================================================

//_OBJECT_NEUTRAL_BLOCKED/ACTIVATED_BLOCKED
//====================================================================================================================================================================================================================================================
//             X           Y        PIXEL_0     ALFA_0     PIXEL_1      ALFA_1       PIXEL_2     ALFA_2        PIXEL_3     ALFA_3         PIXEL_4       ALFA_4           PIXEL_5     ALFA_5        PIXEL_6     ALFA_6    PIXEL_7     ALFA_7
//====================================================================================================================================================================================================================================================
_NS_gr7,       0,          0,    C'245,245,245',  255,   C'245,245,245',  255,     C'180,180,180',  255,        C'180,180,180', 255,       C'200,200,200',   255,        C'245,245,245',  255,       C'235,235,235',   255,         C'245,245,245',  255,         _PL_END,
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//====================================================================================================================================================================================================================================================
 
Это всего один элемент из более 30. Причем, один из самых маленьких. Но удивительное дело, - я читаю его как открытую книгу. Никакого труда объяснить что чего представляет у меня нет. Еще странно то, что подобные элементы создаются очень быстро, с помощью копипасты других похожих элементов, и внесения некоторых поправок. Выглядит страшно, но на деле все очень легко. 
Причина обращения: