Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Новая технология программирования   Найти похожие ветки 

 
Alkid ©   (2007-11-12 14:33) [0]

Разбираюсь сейчас в дивном коде. Нашёл навый паттерн проектирования. Суть примерно следующая: сделать впроекте N классов у которых сделать много приватных полей и методов и в каждом классе прописать все остальные как friend`ы. :-(

И как это рефакторить?

Сразу вспоминается Паблик Морозов.

P.S. Сорри, это крик души :)


 
Джо ©   (2007-11-12 14:43) [1]

> [0] Alkid ©   (12.11.07 14:33)
> И как это рефакторить?

Day by day, dude, day by day...
:-D


 
Игорь Шевченко ©   (2007-11-12 15:04) [2]

Я же говорил, что кривой код можно написать на любом языке :)


 
Alkid ©   (2007-11-12 15:15) [3]


> Day by day, dude, day by day...

Да, вот, помоим рассчётам, если его рефакторить, то придётся переписать процентов на 150 :)


 
Mystic ©   (2007-11-12 15:28) [4]

> Я же говорил, что кривой код можно написать на любом языке
> :)


И с использованием любой методологии :)


 
Джо ©   (2007-11-12 15:34) [5]

> [4] Mystic ©   (12.11.07 15:28)
> > Я же говорил, что кривой код можно написать на любом языке
>
> > :)
>
> И с использованием любой методологии :)

А если методологий не хватает, не беда — придумываем свою. Например, как в сабже :)


 
Anatoly Podgoretsky ©   (2007-11-12 15:51) [6]

> Alkid  (12.11.2007 15:15:03)  [3]

Ты наш человек, русский - переписать все нафиг.


 
vpbar ©   (2007-11-12 16:07) [7]

Alkid ©   [0]
Оно работает? А то помниш анектод про отца программера и сына, спросившего "почему солнце встаёт на восходе, а садиться на западе"? Может последовать совету.


 
oxffff ©   (2007-11-12 16:13) [8]


> Alkid ©   (12.11.07 14:33)  


Так может сделать их все nested  в каком нибудь классе все они public.
А encloser сделать private?


 
Alkid ©   (2007-11-12 16:39) [9]


> vpbar ©   (12.11.07 16:07) [7]
>
> Alkid ©   [0]
> Оно работает?
>

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

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


 
Alkid ©   (2007-11-12 16:40) [10]


> Так может сделать их все nested  в каком нибудь классе все
> они public.
> А encloser сделать private?

А смысл? Фишка-то в том, что надо поддерживать и развивать этот код, ибо он делает полезные вещи. Т.е. нельзя его просто "спрятать" и забыть (мол, работает, и ладно).

Тут вообще таких маразмов хватает.


 
Anatoly Podgoretsky ©   (2007-11-12 16:48) [11]

> Alkid  (12.11.2007 16:39:09)  [9]

Только умный индус знает как работает его код.
Между этой стадией "следующая редакция дастся ещё бОльшей кровью. И так пока код станет окончательно неподдерживаемым." и последней много крови.


 
Alkid ©   (2007-11-12 17:08) [12]


> Только умный индус знает как работает его код.

Ну это ты преувеличиваешь. Я тоже знаю как работает мой код :)
Хоть и не всегда во всех мелочах, но помню основные принципы и идеи. А тут я пока не вычленил никаких принципов и идей - весь большой кусок кода представляет собой один большой монлит. Big ball of mud, если выражаться точнее :)


> Между этой стадией "следующая редакция дастся ещё бОльшей
> кровью. И так пока код станет окончательно неподдерживаемым.
> " и последней много крови.

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


 
Kolan ©   (2007-11-12 17:12) [13]

> И как это рефакторить?

Как написано в книге, акауратно и по пунктам.


 
Alkid ©   (2007-11-12 17:20) [14]


> Как написано в книге, акауратно и по пунктам.

В данной ситуации это будет затратнее, чем переписать всё с нуля :)


 
Kolan ©   (2007-11-12 17:27) [15]

> В данной ситуации это будет затратнее, чем переписать всё
> с нуля :)

Ну дык &#133:)

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


 
Alkid ©   (2007-11-12 17:46) [16]


> А вы чем пользуетесь? Если DBS 2006 и выше, то там гораздо,
>  гораздо быстрее можно прорефакторить.

Microsoft Visual C++ :) Семёрка и восьмёрка. :)


 
oxffff ©   (2007-11-12 17:53) [17]


> Alkid ©   (12.11.07 16:40) [10]
>
> > Так может сделать их все nested  в каком нибудь классе
> все
> > они public.
> > А encloser сделать private?
>
> А смысл? Фишка-то в том, что надо поддерживать и развивать
> этот код, ибо он делает полезные вещи. Т.е. нельзя его просто
> "спрятать" и забыть (мол, работает, и ладно).
>
> Тут вообще таких маразмов хватает.


Насколько я понял, что ты ставищь задачу не прописывать дружественность для каждого добавляемого класса.
Но сохранив приватность этих классов. Тебе нужен inner scope
Поэтому и oxffff ©   (12.11.07 16:13) [8]

Или что тебе надо? Сформулируй.


 
Alkid ©   (2007-11-12 18:04) [18]


> Или что тебе надо? Сформулируй.

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


 
Mystic ©   (2007-11-12 18:08) [19]

> В данной ситуации это будет затратнее, чем переписать всё
> с нуля :)


Все ли требования к системе известны? Или все требования к системе задокументированы только в исходнике C++?


 
Romkin ©   (2007-11-12 18:13) [20]

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


 
Джо ©   (2007-11-12 18:26) [21]

> [20] Romkin ©   (12.11.07 18:13)
> А методика файрвола не пойдет?
> Типа отгородить весь этот код как-бы стеной, с верификацией
> всех вызовов, а в качестве морды написать легкую навеску
> классов (которые будут дергать этот код), и общаться уже
> с ними?

О, вот и я о том же подумал.
Закопать этот код поглубже и не трогать его. Налепить только к нему человеческий интерфейс и с ним уже в дальнейшем работать.
Дешево и практЫчно, а, главное, относительно безопасно :)


 
Alkid ©   (2007-11-12 18:26) [22]


> Все ли требования к системе известны? Или все требования
> к системе задокументированы только в исходнике C++?

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

Задача стоит несколько расплывчато: надо освоить исходный текст и
"улучшить" его, т.е. зарефакторить.

А с этим есть 2 большие проблемы:

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

2. Этот код занимается поддержкой одной вещи, для которой нет открытой документации и информация о которой была добыта автором путём реверс-инжиниринга, по результатам которого было написано много неряшливого кода и мало документации.

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

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


 
Alkid ©   (2007-11-12 18:29) [23]

С файерволлом, понятно дело, особо не получится.
Во-первых, он есть - интерфейсы определены нормально.
Во-вторых, стоит задача *развивать* этот код, т.е. "закопать и забыть" не получится.


 
Kolan ©   (2007-11-12 18:32) [24]

> Задача стоит несколько расплывчато: надо освоить исходный
> текст и
> «улучшить» его, т.е. зарефакторить.


Шо просто улучьшить, рефакторят тогда, когда надо: разобраться, изменить что-то


> рода модификации связанные как с исправлением багов, так
> и с расширением функциональности


А теперь ясно.

Надобы запахи найти если рефакторить&#133

> Любая модификация в любом месте ведёт к каскаду мелких модификаций
> по всему проекту, что бы сохранить целостность кода.

Похоже на Shotgun Surgery соотв use Move Method and Move Field to put all the changes into a single class и use Inline Class to bring a whole bunch of behavior together


 
Anatoly Podgoretsky ©   (2007-11-12 18:52) [25]

> Alkid  (12.11.2007 17:08:12)  [12]

Классику не знаешь, есть один труд - как пишут код те или другие программисты, ссылку не могу привести.


 
Mystic ©   (2007-11-12 19:13) [26]

> Alkid ©   (12.11.07 18:26) [22]

> 2. Этот код занимается поддержкой одной вещи, для которой
> нет открытой документации и информация о которой была добыта
> автором путём реверс-инжиниринга, по результатам которого
> было написано много неряшливого кода и мало документации.


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

> Anatoly Podgoretsky ©   (12.11.07 18:52) [25]
> Классику не знаешь, есть один труд - как пишут код те или
> другие программисты, ссылку не могу привести.


http://webest.net/2005/12/27/programmistyi-russkiy-kitaytsyi-kanadets-i-indus.php


 
Petr V. Abramov ©   (2007-11-12 22:28) [27]

> сделать впроекте N классов у которых сделать много приватных полей и методов
replace`ом, мб. контролируемым, private -> protected, заткнуть дыры, потом разбираться
:)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.041 c
15-1193856158
Petr V. Abramov
2007-10-31 21:42
2007.12.09
Про википедию


2-1194894940
alikon1
2007-11-12 22:15
2007.12.09
Работа со скобками


2-1194347844
Lebedev
2007-11-06 14:17
2007.12.09
Нижние индексы и греческий шрифт.


2-1194980698
pioner85
2007-11-13 22:04
2007.12.09
Извращения с DateTimePicker


15-1194876938
Hint
2007-11-12 17:15
2007.12.09
Задания от Яндекса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский