А сайт рушный или буржунетский?
Добавил в закладки :)
Есть такой проект Pinax, можете на него посмотреть. Но не думаю, что использование готовой сборки оттуда даст сильный профит по сравнению с собственной сборкой с нуля из стандартных джанговых компонентов.
И если будете смотреть в сторону джанго, то в качестве бд советую присмотреться к PostgressSQL. Это изначальная джанговая БД, его еще опенсорсным ораклом называют. Для больших нагрузок он имхо, получше mysql будет.
Нет скорее всего такого примера, если говорить о реальных проектах (не примерах). Речь об идеале, а он по определению недостижим. Можно говорить только о степени приближения к идеалу.
Но, повторюсь, недостижимость идеала вовсе не означает того, что к нему не нужно стремиться.
Не могу себе представить, как наличие комментов в коде может помочь определиться в отношении сколько нибудь большого проекта. Пусть те же 20-30К строк кода, из вашего примера. Тут уже играют роль другие вещи - наличие доков, какого то комьюнити и т.п. Даже график чекинов за последние полгода-год имхо больше скажет, если речь об опенсорсе.
Речь совсем не о том, чтобы взять произвольный модуль и сразу сказать что и как он делает. Мне трудно представить себе, когда это может понадобится.
В код джанги я лазил всего два раза, обычно вполне хватает документации. Один раз нужно было сделать похожий функционал в неджанговом проекте, второй раз выяснить причину непонятных тормозов. В обоих случаях у меня было представление о проблеме, которую надо решить и какие-то свои варианты решения этой проблемы. И комменты как-то не понадобились. В одном фрагменте их не было, во втором я их и не читал - из кода и так все стало ясно.
Я не буду утверждать, что там нет запутанных мест, требующих комментов. Проект все таки достаточно большой. Может, просто повезло оба раза.
Я вам про другое пытаюсь сказать. Комменты в коде в подавляющем большинстве случаев это костыли, подпирающие неряшливый код. Но вам ведь победить надо, да?
Ну да, судя по кол-ву смайликов, требований и вопросов, вы настоящий интенет-воин и знатный боксер по переписке. Вы меня победили, признаю. Довольны? 🚬
Нет, не менялся.
Видел, видел :)
Докстринги - это способ генерации документации. А комменты в коде - это дружелюбие джанговского комьюнити. Если их убрать, код останется таким же ясным. Попробуйте поэкспериментировать на досуге.
Документация обязательно нужна. Но комментарии в коде - это не документация.
https://www.djangoproject.com/
Кода там существенно больше 30К строк.
Использование хорошо спроектированного фреймворка не добавляет оверхеда. По крайней мере такого, который можно инструментально измерить. Другое дело, что таких фреймворков мало по сравнению с основной массой.
Просто жестокий человек. По отношению к своим заказчикам.
Вот именно поэтому, я предпочитаю бесплатные опенсорсные решения платным проприетарным. Благо сейчас выбор есть. Хотя бы из тех соображений, что выкладывать свои какашки на всеобщее обозрение люди как правило стесняются, а в закрытых решениях "сойдет и так" (С).
А насчет того, что каждый программер (я в том числе) написал говнокода гораздо больше, чем кода, которым можно гордиться - кудыж от этого деться. Жисть такая. Но это совсем не отменяет стремления к совершенству. :)
Вообще то в отрывке речь о том, что
Если речь о конкретном примере, то для меня разобраться в том, что делает (и как работает) код в варианте 2 гораздо легче, чем в варианте 1.
Ида, обратите внимание на присутствие комментариев в 1 варианте, и их отсутствие во 2. 🚬
Вариант 1.
DWORD WINAPI SecondThread (LPVOID lpwThreadParm) { BOOL fDone = FALSE; DWORD dw; while (!fDone) { // Wait forever for the mutex to become signaled. dw = WaitForSingleObject(g_hMutex, INFINITE); if (dw == WAIT_OBJECT_0) { // Mutex became signalled. if (g_nIndex >= MAX_TIMES) { fDone = TRUE; } else { g_nIndex++; g_dwTimes[g_nIndex - 1] = GetTickCount(); } // Release the mutex. ReleaseMutex(g_hMutex); } else { // The mutex was abandoned. break;// Exit the while loop. } } return(0);}
Вариант 2.
DWORD SecondThread(void *ThreadParm){ while(Index < MAX_TIMES && WaitForSingleObject(Mutex, INFINITE) == WAIT_OBJECT_0) { if (Index < MAX_TIMES) Times[Index++] = GetTickCount(); ReleaseMutex(Mutex); } return(0);}
Хороший код значительно сокращает затраты времени на его сопровождение и развитие. Как новым человеком, так и автором спустя полгода-год. Меньше мест, куда при правках можно пристроить источник глюков.