Ну хорошо, слегка передернул. Мне приходилось просматривать массу исходников.
Просто я никогда не забывал о том, что код писался конкретными людьми с определенными привычками и симпатиями для достижения конкретных целей, а не как учебное пособие. Может тут есть такие, что и комментируют все подряд?
Бо лично у меня просмотр даже своего кода после некоторого перерыва (месяц и больше) начинается с: а это ишо шо за фигня, ага - понял, а это…
Member
Статус: Не в сети Регистрация: 18.08.2005 Откуда: Новороссийск
Daemon Спасибо, правда не знаю что и сказать, помогло мне знание о наличии этого инструмента (depends.exe) или наоборот, т.е. ещё больше озадачило. Первое впечатление: "Лучше б я не знал об этой программке", надеюсь первое впечатление обманчиво! Странно что в MSDN 2004 об этой утилите есть информация, а в Visual Studio 2003 .NET этой утилиты нет (неужеле она такая новая), но я её нашёл в Visual Studio 2005 Pro, правда ещё придётся потратить не мало времени на ознокомление с программой. Кстати как можно отличить готовый проэкт (*.exe) например Win32 от MFC, эта утилита в этом деле лучший товарищ? Например в проэкте Win32 в первой строке (depends.exe) написанно USER32.DLL, а в проэкте MFC, MFC71.DLL, это и есть отличительные признаки и стоит ли этому доверять? Теперь я начинаю больше понимать о том, как взламывают чужие exe-шки, ведь даже вполне легальные программы выдают всю поднаготную готового, откомпилированного проэкта, я уже не говорю об дизассемблерах и других "хитроумных" программах.
Member
Статус: Не в сети Регистрация: 24.09.2004 Откуда: Belarus, Mensk
_SGK писал(а):
Может тут есть такие, что и комментируют все подряд?
Угу. Как минимум public и protected члены. Плюс еще про code coverage не забываем. Скажем, вот простой метод по переводу HEX строгового представления цвета в структуру System.Drawing.Color:
Код:
/// <summary> /// Retrieves a <see cref="T:System.Drawing.Color"/> from the string specified in the FFFFFF format. /// </summary> /// <param name="hexString">Specifies hexademical color representation.</param> /// <exception cref="T:System.ArgumentNullException"><paramref name="hexString"/> is <see langword="null"/>.</exception> /// <exception cref="T:System.ArgumentException"><paramref name="hexString"/> is empty.</exception> /// <exception cref="T:System.FormatException"><paramref name="hexString"/> is not in the correct format.</exception> public static Color ColorFromHex(string hexString) { Debug.Assert(!string.IsNullOrEmpty(hexString), "!string.IsNullOrEmpty(hexString)"); Argument.VerifyNotNullOrEmpty("hexString", hexString);
if (hexString.Length != 6) { throw new FormatException(Properties.Resources.ColorFromHexFormatException); }
[TestFixture] public partial class NuGenControlPaintTests { [Test] [ExpectedException(typeof(ArgumentNullException))] public void ColorFromHexArgumentNullExceptionTest() { NuGenControlPaint.ColorFromHex(null); }
[Test] [ExpectedException(typeof(ArgumentException))] public void ColorFromHexEmptyStringExceptionTest() { NuGenControlPaint.ColorFromHex(""); }
[Test] [ExpectedException(typeof(FormatException))] public void ColorFromHexIncorrectFormatExceptionTest() { NuGenControlPaint.ColorFromHex("FF"); }
[Test] [ExpectedException(typeof(FormatException))] public void ColorFromHexIncorrectFormatExceptionTest2() { NuGenControlPaint.ColorFromHex("FFFFFFF"); }
[Test] [ExpectedException(typeof(FormatException))] public void ColorFromHexIncorrectFormatExceptionTest3() { NuGenControlPaint.ColorFromHex("GGGGGG"); }
[Test] public void ColorFromHexRegularTest() { byte red = 0xab; byte green = 0xcd; byte blue = 0xef;
Color color = NuGenControlPaint.ColorFromHex( Convert.ToString(red << 16 | green << 8 | blue, 0x10) );
Взглянув на этот stuff уже не возникает никаких вопросов, как ты выражаешься "а это ишо шо за фигня" Добавлено спустя 12 минут, 29 секунд -=alex-forewer=- Как пользователь Total Commander могу тебе посоветовать просто встать на DLL или EXE и нажать F3. Далее закладка Dll Dependency. Приятно удивись. А MFC приложение таки да, должно сслылать на что-то вроде MFC42.DLL и т.д. Первая там строка или вторая не имеет никакого значения. MFC сам USER32.DLL дергает.
_________________ ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
eisernWolf
eisernWolf писал(а):
Сказка... А вообще в принципе можно и "сразу бросаться"... писать тесты
Не сказка. Над большим проектом иначе просто невозможно работать - он развалится по кускам. будет куча заплаток, затычек, временных решений, которые, конечно же, потом переделаются, но не переделываются никогда _SGK
_SGK писал(а):
Во уже и глобальные переменные в ход пошли. Под глобальными процедурами подразумевались процедуры определенного направления оформленные, как правило, отдельным модулем. Как в таком случае можно заблудиться даже ума не приложу.
Дай только человеку возможность объявить процедуру общего назначания, которая, по его мнению очень нужна, так он туда еще и десяток переменных запихнет. Я вполне серьезно.
_SGK писал(а):
Фантастики небось в детстве начитались? Умников в совместных проектах нет, их удел – одиночество типа: "Hello World" да самопальные бенчи.
К сожалению, у меня на работе есть. Эти "непризнанные гении" все время все хотят переделать, оптимизировать, отойти от устоявшейся структуры. За что и получают по рукам. Иногда очень больно
_SGK писал(а):
а для квалифицированного специалиста выяснить "откуда растут ноги" точно не проблема.
На кой черт мне нужно разбираться, кто и зачем в файл misc.cs напихал десяток функций, при чем сразу видно, что писали разные люди. Оно мне нужно с этим разбраться? Я уже не говорю за полное отсутствие комментариев, безграмотное название, такое же оформление
_SGK писал(а):
Вот правда в жизни бывает иначе, потому как "полочки" эти в процессе разработки постоянно добавляются.
Если полочки собираются добавляться, то лучше сразу ту часть шкафа, где эти полочки будут стоять, пересмотреть. Иначе оно же и рухнуть может. И даже задавить кого-нибудь.
По поводу комментариев. Я очень не любил комментировать код. Но со временем это прошло. Когда я залажу в код, который писал год назад, я сразу понимаю, что это, зачем нужно и как работает. Есть еще один момент. Над проектом работает много людей. И часто другим людям приходится смотреть код. И уж пусть лучше они сами там все прочитают, чем будут меня дергать с вопросами типа "а шо это?". Верно и обратное.
Да и вообще, нифига это не сказки. Это суровая реальность разработки более-менее крупного проекта. Более того, я еще большой приверженец ведения полной документации по проекту. Пусть побегает девочка, день меня тупыми вопросами подостает, зато потом будет лежать большой талмуд, в котором концепция проекта расписана досконально, вплоть до того, что известно кто какие части реализовывал
Addison Wesley - eXtreme .NET. Introducing eXtreme Programming Techniques to .NET Developers - 2004.chm
MS Press - Extreme Programming Adventures in CSharp - 2004.chm
Питер - Экстремальное программиование. Разработка через тестирование - 2003.pdf
Питер - Экстремальное программирование - 2003.pdf
O'Reilly - Unit Test Frameworks - 2004.chm
The Pragmatic Programmers - Pragmatic Unit Testing in C# with NUnit.pdf
Большинство ищется на natahaus.ru. Остальное через emule.
P.S. Да, еще про парное программирование не забываем Сам на практике не применял, возможности такой не было...
_________________ ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
eisernWolf Это все, конечно, очень хорошо. С принципами экстремального программирования я так же знаком. НО, с очень многими моментами я не согласен. Я не видел ни одного коллектива, которых бы на практике продолжительное время применял эти принципы. Возможно, у нас просто не та область, чтобы применять эти методы, но эффективности в них я не вижу.
Member
Статус: Не в сети Регистрация: 24.09.2004 Откуда: Belarus, Mensk
--Vel-- Эффективность чувствуется, когда видение заказчиком проекта изменяется каждую неделю...
_________________ ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
eisernWolf Не согласен. На внешней изменчивостью и наворачиванием фиг каждую неделю очень часто стоят банальные заглушки, которые работают сегодня, но завтра конфликтуют с другой написанной частью. Заказчику же каждую неделю зад абсолютно не обязательно подлизывать
Member
Статус: Не в сети Регистрация: 24.09.2004 Откуда: Belarus, Mensk
--Vel-- А причем тут заглушки? Речь идет о том, что иногда приходится вносить такие изменения, которые плохо ложатся на существующий дизайн. Уточню: дизайн нынешний продумывался _заранее_, но исходя из тех, предыдущих требований. А конфликтовать там ничего не будет, если головой думать, а не дебуггером, да и тесты не дадут.
_________________ ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
eisernWolf Если видение проекта заказчиком кардинально изменяется каждую неделю, то имеем две ситуации:
1. быстро пишем/дописываем/правим. В итоге, через 3-4 месяца такой работы текст проекта превращается в сплошную кашу в любом случае, даже при очень грамотном программировании. В итоге заказчик все равно остается недовольным, т.к. на самом деле сам не знает, чего хочет
2. Составляется абсолютно точная спецификация проекта с возможностью мелких изменений/крупных добавлений. Если же после этого заказчик все же меняет свое видение не раз и не два, то такой заказчик посылается очень далеко.
Наоборот, при грамотном изначальном проектировании мы себе оставляем довольно много простора для манервов и изменений. При написании "в лоб" через какое-то время проще все выкинуть и начать переписывать с нуля. Это уже проходили и не раз
Member
Статус: Не в сети Регистрация: 24.09.2004 Откуда: Belarus, Mensk
--Vel-- писал(а):
Наоборот, при грамотном изначальном проектировании мы себе оставляем довольно много простора для манервов и изменений.
Предусмотреть всего невозможно. А излишне расширяемая архитектура с легкостью позволит утонуть при ее поддержке (тех же изменениях).
--Vel-- писал(а):
При написании "в лоб" через какое-то время проще все выкинуть и начать переписывать с нуля. Это уже проходили и не раз
Точно. Поэтому я и обратился к XP.
P.S. Никогда я не любил эти пустые идеологические споры... Я практик. Работать надо. Завязываю.
_________________ ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.
уже не возникает никаких вопросов, как ты выражаешься "а это ишо шо за фигня"
Не, ну я не про это говорил.
--Vel-- писал(а):
Дай только человеку возможность объявить процедуру общего назначания, которая, по его мнению очень нужна, так он туда еще и десяток переменных запихнет. Я вполне серьезно.
Мысль понял, если смотреть с точки зрения: "заставь дурака богу молится…" то да.
--Vel--
--Vel-- писал(а):
На кой черт мне нужно разбираться, кто и зачем в файл misc.cs напихал десяток функций, при чем сразу видно, что писали разные люди. Оно мне нужно с этим разбраться? Я уже не говорю за полное отсутствие комментариев, безграмотное название, такое же оформление
Прям страшилки какие-то, чес. слово.
--Vel-- писал(а):
Над проектом работает много людей. И часто другим людям приходится смотреть код. И уж пусть лучше они сами там все прочитают, чем будут меня дергать с вопросами типа "а шо это?"
Относительно комментариев я специально спросил:
_SGK писал(а):
Может тут есть такие, что и комментируют все подряд?
Безусловно, что-то комментируется, назначение класса там, определенные моменты интерфейса, но не более. Пример: класс содержит два десятка полей данных (переменных), столько же методов, часть которых составляют свойства и события, все это дело реализовано примерно в 2000 строках. Естественно, что все корме интерфейса (свойства, события, некоторые public методы при наличии оных) инкапсулировано и комментировать это, к примеру для вас, я не вижу никакой необходимости. Потому как это готовый РАБОЧИЙ класс, а не учебное пособие. Есть интерфейс класса вот и пользуйтесь им, есть желание разобраться во всем глубже – милости просим, код перед вами. Также есть нормы и рекомендации относительно определенных моментов реализации. К примеру C# позволяет создавать события любого типа, однако для совместимости с .NET Framework Microsoft требует, чтобы обработчики события имели два параметра (ссылка на объект и инфа для обработчика). Если парни мутят что-то свое, то - мдя…
Когда я писал:
_SGK писал(а):
начинается с: а это ишо шо за фигня, ага - понял, а это…
То подразумевал именно просмотр реализации определенных методов. Бо как Вы правильно заметили, иногда возникает потребность или желание уточнить, как именно конкретный момент был реализован, а это могут быть и сотни строк. Кстати пару лет назад я ругался с куратором проекта относительно необходимости разжевывания определенных моментов одному товарищу. Потому как искренне убежден , что совместная работа должна строится либо на определенном уровне подготовки всех участников, либо на разграничении обязанностей относительно реализации с учетом этой самой подготовки (по-русски: не рубишь, нефиг и лезть, занимайся тем, чем можешь).
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
_SGK
_SGK писал(а):
Безусловно, что-то комментируется, назначение класса там, определенные моменты интерфейса, но не более. Пример: класс содержит два десятка полей данных (переменных), столько же методов, часть которых составляют свойства и события, все это дело реализовано примерно в 2000 строках. Естественно, что все корме интерфейса (свойства, события, некоторые public методы при наличии оных) инкапсулировано и комментировать это, к примеру для вас, я не вижу никакой необходимости. Потому как это готовый РАБОЧИЙ класс, а не учебное пособие.
Это хороший рабочий класс до тех пор, пока не случится одно из следующих: 1. он перестал стабильно работать 2. он требует необратимых улучшений. другими словами, его нужно неслабо дополнить или модернизировать Поэтому у меня сейчас за правило выступает следующее: на класс - комментарий зачем оно нужно. На значимые данные - комментарии, зачем оно нужно, служебки пропускаются. На методы, свойства, события - комментарии с той же целью. Далее, сам код класса - названия всех функций как минимум удобочитаемые (тот же комментарий, своего рода) + особо тяжело читаемые куски кода или же с закрученной логикой - как можно более полный комментарий. Плюс, если получается так, что логически завершенные куски кода приходится лепить в одну фукнцию, то опять же комментариями с пояснениями отделять друг от друга. Муторно написал? Куча лишних телодвижений в тот момент, когда "мысля прет"? Угу, не спорю. До тех пор, пока это просто не станет хорошей привычкой и просто сам не замечаешь, что руки комментарий пишут. Главное заставить себя приучиться к этому. Самому же потом легче будет.
_SGK писал(а):
Прям страшилки какие-то, чес. слово.
Это не страшилки, а реальные последствия одного очень запущенного случая. Чаще всего, конечно же, до этого не доходит. Но лучше же все пресекать на корню, правильно
Это типа как? Я в шоке... Не, ну я, конечно, могу понять как пришедший на вызов сантехник после пары "капель" , принятых на грудь, во время очередного перекура перестает стабильно работать. Но, чтобы класс ранее нормально использовавшийся, вдруг заглючил...
--Vel-- писал(а):
2. он требует необратимых улучшений. другими словами, его нужно неслабо дополнить или модернизировать
Да, тут варианты есть.
--Vel-- писал(а):
Муторно написал? Куча лишних телодвижений в тот момент, когда "мысля прет"?
Ага, хотя ИМХО кто платит - тот и заказывает музыку.
--Vel-- писал(а):
До тех пор, пока это просто не станет хорошей привычкой и просто сам не замечаешь, что руки комментарий пишут.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
_SGK
_SGK писал(а):
Это типа как? Я в шоке...
Да запросто. У меня на робте такое встречается. Правда классы довольно масштабные, но ошибки закрадываются. В обычных реживах все работает нормально. А зохочет пытливый извращенный ум чего-то эдакого вывернуть и вылезет бага, о которой даже никто и подумать не мог. Не бывает же совершенных программ.
Да, кстати, ради разнообразия, чтобы не быть голословным. Вот маленькая программка на ассемблере. Очень простенькая, даже банальная, но практически без комментариев. И могу сказать, что довольно тяжело было там что-то изменить, листая эта пару страниц кода. Не мог я вспомнить чего, где и куда. за стиль написания не пинать, сам все знаю. Это, если мне не изменяет память, был курсовой на первом или втором курсе института, т.е. зеленым я еще был
Правда классы довольно масштабные, но ошибки закрадываются.
Ну так сам сказал, что ошибки закрадываются. Соответственно кривая реализация.
--Vel-- писал(а):
зохочет пытливый извращенный ум чего-то эдакого вывернуть и вылезет бага, о которой даже никто и подумать не мог.
Обработка исключительных ситуаций – самое оно. Если необходимо, то и повторное генерирование (throw) для перехвата внешней catch-инструкцией.
А уж если чел не сном, не духом какие исключения у него в классе могут возникнуть, то ИМХО это уже тяжелый случай.
У вас в штате не хватает программера – параноика ну или тестера - аналитика на худой конец.
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
_SGK Все у нас есть . Наверное просто не смог объяснить нормально. Может такой пример будет понятнее - у класса есть n-ная функциональность. Она протестирована. Реально же используется только часть функциональности. И вот в один прекрасный момент понадобилось использовать все. Класс работает, программа ошибок не выдает, но сам класс выполняет не совсем адекватные действия и на выходе дает немного не то, чего бы хотелось. Бывает такое. Какая бы прямая реализвация не была, но такое есть. Ну или я ничего в программировании не понимаю. Одно из двух
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
--Vel--
Цитата:
Дай только человеку возможность объявить процедуру общего назначания, которая, по его мнению очень нужна, так он туда еще и десяток переменных запихнет. Я вполне серьезно
Чисто с теоретической точки зрения я с тобой не соглашусь, потому как тут существует 2 аспетка: 1. Если процедура могла бы быть в глобальном пространстве имен, но ее упаковали в класс, в виду отсутсвия глобального пространства имен. Получается, что в этом случае мы под принципом инкапсуляции понимаем только data hiding, что есть не верно (если судить по Бутчу). 2. Если требуется глобальная переменная, но пришлось ее допустим упаковать в класс (в качестве статической переменной) и уже к ней обращатся, то в этом случаи получаем нарушение инкапсуляции. Как минимум это плохой стиль, максимум ведет к серьезным последствиям
По этому не вижу ничего серьезного в том, если прийдется выделить отдельный неймспейс для глобальных переменных или процедур (говорю касательно плюсов).
_SGK
Цитата:
Бо лично у меня просмотр даже своего кода после некоторого перерыва (месяц и больше) начинается с: а это ишо шо за фигня, ага - понял, а это…
Ты кошмарный сон багфиксера В крупных компаниях существуют свои правила по оформлению кода, его комментированию, или же они пользуются общеизвестными (mozila + doxygen нынче очень популярен).
Advanced member
Статус: Не в сети Регистрация: 12.01.2004
Daemon Согласен по обоим пунктам, особенно по второму. Но, ведь кроме плюсов сузествуют и минусы. И их не мало. Хотя, если действителньо грамотно спроектировать такой неймспейс, то все же плюсы перевешивают
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения