Какой код лучше? Копактный, сложный или длинный, простой?
kerdan:
если привыкнуть писАть компактный код, то потом если будете
изучать не компактный то будут возникать такие ситуации:
смотришь, смотришь, 1,2,3,5 строка и понимаешь - на хрен этот
ламер такую хрень расписывает на столько строк???
мозги со временем выработают дополнительные извилины, которые ни
кому еще не помешали и вам станет удобнее смотреть и писАть маленький код с высокой смысловой нагрузкой.
Флудить на эту тему там не хочу, поэтому спрашиваю здесь.
Какой код лучше? Копактный, но сложный или длинный, но простой?
Сейчас, при программировании на Яве я пользуюсь парадигмой KISS. Достаточно простые участки кода приходится расписывать на несколько строк. Зато, сразу понятно, что делает тот или иной кусок кода.
Ваше мнение?
Для скриптовых языков вроде JavaScript, ActionScript - чем код меньше тем лучше (экономия трафика все таки)...
Для всех остальных языков ИМХО важнее чтобы код был эффективным и хорошо читался...
Не думаю что при компиляции в С++ будет сильно заметна разница между длинным x = x +1; и коротким x++;
а вообще - по ситуации. я пишу в основном на perl, где возможности по написанию компактного кода просто неограничены. но надо не забывать и о тех, кому придется потом это разбирать ;) и, кстати, опрос некорректен. компактный код != сложный.
Давай приведём конкретный пример. Сишный оператор присваивания позволяет в одной строчке изменить значения сразу нескольких переменных да ещё и с условиями. Возьмём школьный пример - решение квадратного уравнения.
Можно записать в одной строчке сразу и вычисление дискриминанта, и проверку его и т.д. вплоть до получения корней. А можно "по-школьному":
d = ...
if ...
...
else
...
Вот товарищ WandM и интересуется - кто что предпочитает.
Опрос, ИМХО, неуместен..
Все зависит от языка, во-первых.. и от того, что ты(мы/они :)) считаешь "понятным" кодом..
Классический, хоть и не сказать, что супер-жизненный пример:
Изменение состояния "RadioButton" по нажатию кнопки:
rbMine.Checked = !rbMine.Checked;
..
А не:
if (rbMine.Checked)
rbMine.Checked = false;
else
rbMine.Checked = true;
..
Для меня лично спорно, какой из вариантов "лучше".. Так, что все зависит..:)
если пишешь для себя, то писать надо как тебе удобнее.
Если уж браться писать такое, то надо знать все о своем компилере.
И единственно, чтобы запутать тех кто будет пытаться дизассемблировать:D
экономия места на диске и в памяти и экономия времени процессора
а какой код лучше использовать для объяснения? тоже компактный, но сложный для понимания???
[quote=ahilles]экономия места на диске и в памяти и экономия времени процессора[/quote]
а что при нынешних объемах жестких дисков у кого-то проблемы с тем, чтобы разместить несколько лишних Кб? сейчас машины почти у всех очень мощные и экономия памяти и времени процессора нужна только в продуктах, в которых промедление - смерти подобно. может еще предложишь всем на ассемблер перейти?:)
Интересно как будет выглядеть двигло сайта написанное на асме... :confused:
да кстати там весь спор начался из за следующих кусков кодов(немного изменены но смысл остался тот же):
№1
if num mod i = 0 then break;
и №2
while i<=num div 2 do
begin
if num mod i = 0 then break;
inc(i);
end;
второй вариант вроде как длиннее не правда ли? а теперь дизассемблеруй и попробуй найти разницу.
[quote=RussianSpy]Интересно как будет выглядеть двигло сайта написанное на асме... [/quote]
я бы тоже взглянул. просто из доводов приведенных ahilles'ом получается что так и должно быть.
Blaise Pascal
И все же куда приятнее читать 'красивый' код..
Там где можно написать понятно и коротко, там и надо писать 'понятно и коротко', а не расписывать на 5 строчек, то что можно 'изложить' в одной-двух..
вообще-то автора темы интересует что лучше: компактынй и вместе с тем сложный код или длинный и простой. другие варианты типа компактный и простой здесь не фигурируют - оно и так ясно что компактный и простой - это лучше всего.
[quote=koltaviy]И все же куда приятнее читать 'красивый' код..
...
а не расписывать на 5 строчек, то что можно 'изложить' в одной-двух..[/quote]
код который расписан на 5 строк что не может быть таким же красивым как на две?
Вот, примерно об этом я и говорил.
Как писать код, чтобы его мог потом понять "коллега среднего уровня"?
Ведь довольно часто приходится править чужой код, а там иногда бывает, как в том "примерчике" от OlgaKr.
Отыщи код который ты сам писал когда был "коллегой среднего уровня". В таком стиле и пиши.
А что если твой код захочет прочитать не коллега среднего уровня, а коллега 'низкого' уровня..
Дык он и элементарных и кажущихся тебе простых вещей может не разобрать..
Так что писать может и нужно понятно, только не переусердствуя..:cool:
Лично я пишу, так сказать для себя.. Чтобы сам потом мог разобрать, учитывая то, что у меня не извращена фантазия, и я не пишу выражения вроде:
З.Ы.: Спасибо OlgaKr за примерчик:D
:) Аналогично. Пиши так, как писал когда сам был чайником.
<gram|work> Какой самый извращенный способ проверить в условии if () булевскую переменную ?
<gram|work> bool b;
<gram|work> b = false;
<gram|work> if (b == true){...}
<gram|work> Это децкий лепет
<gram|work> ИТАК, ПЕРВОЕ МЕСТО
<gram|work> Знакомый говорит что нашел только что в коде:
<gram|work> if (b.ToString().length < 5){...}
originaly taken from http://bash.org.ru
а вообще, для меня сишные выражения типа if (-1 != (pos = str.Find("smth"))) {...} это нечто вроде отдушины :) это то, что позволяет мне не напрягаться при написании кода. в конце концов это, за что я люблю С. а то, что это может не понять кто-то, кто не знает языка -- это я моя проблема, а его. комменты писать -- да. но не на каждую строчку. код -- вот лучшее описание того, что тут твориться. если какое-то место на самом деле сложное и непонятное или его наличие подобного кода здесь не совсем очевидно, то тогда пишу коммент. коммент прежде всего для себя, чтобы не думать потом, "а зачем здесь это"
Если это не шутка, то так недолго на всю жизнь чайником остаться. Язык определяет мышление. (c) кажется, Дейкстра.
Если уж на начинающих коллег кивать, писать надо так, чтобы они учились, читая ваш код.
так же как и другие проги на асме )))
Не всегда начинающие коллеги хотят учиться и не всегда на это обучение есть время. К сожалению. :(
Ну уж если они сами ничо не хотят - пусть user'ами и остаются, а не в программирование лезут..
Что это за программист такой, который всю свою жизнь будет, к примеру, писать:
try {
e = b\0;
}
catch(...)
{
...
}
..
Нужно учиться 'правильному' коду.. И в этом я полностью солидарен c Freeman..
Помогать в этом конечно нужно, но все-таки..
А вместе с этим прийдет и понимание 'непонятного' доселе кода..;)
Они же все-таки коллеги, а не начальники, чтоб им всё всю жизнь разжевывать..
Ну, если честно, то лично я в данном случае подумал, что условие if будет выполнено всегда.
Мои аргументы:
pos = str.Find("smth"); // логический результат присваивания всегда true
для сравнения C неявно приведет true к 1, получается:
if(-1 != 1)...
Вот так. А, возможно, я просто давно не писал на С :(
Помогать в этом конечно нужно, но все-таки..
А вместе с этим прийдет и понимание 'непонятного' доселе кода..;)
Они же все-таки коллеги, а не начальники, чтоб им всё всю жизнь разжевывать..
А разве я спорю с тобой и с Freeman? :) Я-то согласен. Остался пустяк - убедить в необходимости обучения всех начинающих програмеров. Возьмешся? ;)
Мои аргументы:
pos = str.Find("smth"); // логический результат присваивания всегда true
для сравнения C неявно приведет true к 1, получается:
if(-1 != 1)...
Вот так. А, возможно, я просто давно не писал на С :(
судя по названию функции, речь идет не о присваивании, а поиске подстроки, если строка не найдена возвращается -1, иначе - индекс с которого она начинается.
Не поленился, открыл Visual C и написал:
int f() {
return 5;
}
void main() {
int i;
if (-1 != (i = f())) {
printf("Always done");
} else {
printf("Assertion failed");
}
}
Результат выполнения: "Always donePress any key to continue"
Создавайте новую тему, если решили обсуждать чо там 'получается' и 'возвращается'..
никакой он не логический, обыкновенная операция присваивания переменной пос, а потом сравниваем со значением -1. провер ять не буду, устала :).
А зачем? Это задача рынка и (опосредованно) начальников. Уволить к чёртовой матери дураков, что не хотят учиться - пусть в юзеры идут.
Другой вопрос, что в городе с небольшим рынком ИТ, каким может оказаться Днепропетровск (не знаю, не был), у начальников может просто не быть выбора. "Я его слепила из того, что было..." Но состояние рынка к качеству и уровню кода не имеет никакого отношения.
Не поленился, открыл Visual C и написал:
int f() {
return 5;
}
void main() {
int i;
if (-1 != (i = f())) {
printf("Always done");
} else {
printf("Assertion failed");
}
}
Результат выполнения: "Always donePress any key to continue"
а на пиши
return -1;
}
Надо отоспаться. А, вообще, что-то мы от темы отошли :).
int f() {
return 5;
}
void main() {
int i;
if (-1 != (i = f())) {
printf("Always done");
} else {
printf("Assertion failed");
}
}
К вопросу о 'красоте кода':
1) почему бе не написать так:
int i = f();
if (-1 != i) {
printf("Always done");
} else {
printf("Assertion failed");
}
}
согласись, так значительно читабельнее.
И даже такое:
я бы советовал разносить:
if (-1 != i) {
j = f();
if (-1 != j) {
}
}
Потому, что так интуитивно понятнее, а значит, 'красивее'.
Это мы уже как-то обсуждали: http://forum.codenet.ru/showthread.php?p=139338#post139338
Неправильный подход. Почему бы не писать тогда эти посты так, как писал сочинения в первом классе?
А что если твой код захочет прочитать не коллега среднего уровня, а коллега 'низкого' уровня..
Пусть тогда дорастет до надлежащего уровня.
Если кто-то не понимает творчество Лема или Стругацких, это же не повод писать им книги для дошкольного возраста.
JavaScript - согласен. ActionScript компилируется в байт-код, ему длина кода в известной степени пофигу.
Если кто-то не понимает творчество Лема или Стругацких, это же не повод писать им книги для дошкольного возраста.
Представь ситуацию. С одной стороны, Аркадий сможет понять Бориса только если он будет писать предельно просто. С другой стороны, Борис не может отказаться от Аркадия как от коллеги из-за того, что он выполняет много простой работы на которую у Бориса нет времени. Аркадий предпочитает пить пиво вместо того, чтобы учиться вникать в сложные тексты Бориса.
Как Борис сможет обеспечить высокую производительность команды иначе чем если будет продолжать писать просто?
Как Борис сможет обеспечить высокую производительность команды иначе чем если будет продолжать писать просто?
Сама по себе ситуация расписана некорректно. Что значит "предельно просто"?
Допустим Аркадий не имеет представления о шаблонах, частной и частичной специализации и пр. возможностей языка С++. Допустим, что для Аркадия пустой звук слова "паттерн", "юниттест" и пр.
Тогда есть несколько вариантов решения:
1. Аркадий начинает реже пить пиво, а больше учиться.
2. Сложные места, в которые Аркадий не въезжает, он начинает изучать при помощи юнит-тестов и консультации Бориса.
3. Стык программного кода Бориса и Аркадия они пишут вместе (парное программирование), т.о. Аркадий помимо выполнения задачи ещё и перенимает опыт Бориса.
4. Если вышеперечисленное не осуществляется или не приносит результатов, увольняем Аркадия или перемещаем на другую работу, например, на кухню, мыть посуду. А на его место Борис наберет другого сотрудника и таким образом обеспечит высокую производительность команды.
Ты же не отдашь поломанный телевизор команде двух мастеров, один из которых ничего не смыслит в электронике.
Или не ляжешь на операционный стол к доктору, медсестра которого не смыслит в медицине и боиться крови.
Как Борис сможет обеспечить высокую производительность команды иначе чем если будет продолжать писать просто?
Чо за глупые ситуации?.. Если 'Аркадий':D любит пить пиво - пусть и пьет пиво, а не работает в комманде.. Я понимаю, если бы 'Борис' забивал на 'Аркадия' и позволял себе пить пиво.. Вот это было бы не совсем верно со стороны лучшего специалиста в комманде..
О чем опять же говорил Freeman:)