[Cold holy war] Открывающая фигурная скобочка - извечный вопрос

koly

Как правильно ставить открывающую фигурную скобочку в с-подобных языках?
1.
if (...) {
} else {
}
if (...) {
} else if (...) {
}
2.
if (...)
{
}
else
{
}
if (...)
{
}
else if (...)
{
}
Еще какие-нибудь варианты?
Все ответы, пожалуйста, тщательно обосновывайте

bastii

В С++/C# и в Java разные предпочтения. Джависты открывающую скобочку не переносят, а C++/C# переносят.

garikus

Let's not forget that the main reason for choosing the terse characters in C was the lack of memory on computers in 1970, not the result of extensive research.

Vlad77

man indent

anton7805

гон, почитай исходники на сайте sun

Elina74

Я люблю так:
if(...){
}
else if(...){
}

garikus

Я предпочитаю так:

по аналогии с:

ifani

ну, мой вариант ты знаешь%
но всё же:
if(...)
{
} else if(....)
{
} else
{
}
З.Ы.: java code convention такое, вроде, допускает:о)
потом найду сцылку%

sergey_m

Хуле думать, когда есть регламент style(9).

bleyman

Или http://www.rsdn.ru/article/mag/200401/codestyle.XML#EBDA
Тоже аффторитетно.

lera98

ИМХО рулез первый вариант, я всегда так пишу. Может голосование устроить? Что скажут модераторы?

durka82

"5 копеек" в пользу первого варианта:
1. В первом случае сложнее получить проблему с тем, что после "if (...)" будет какая-то фигня в строке (например, еще код за пределами экрана)
2. Первый вариант занимает меньше строк - больше кода влезет на один экран
Так что первый вариант позволяет уменьшить вероятность ошибок и сделать код более читабельным - я за него

bastii

Обычно наоборот вставляют пустые строки, чтобы разбивать код на блоки, которые логически независимы, и чтобы в глазах не рябило.

lord2476

если не разветвляется то
  
if {
}
если разветвляется то всегда
  
if
{
if
{
}
}

durka82

А на блоки среда разработки должна помогать разбить

Ivan8209

Обычно, логически независимые блоки выносят в подпрограммы.
Но боевиков ООП модульному программированию не обучали.
---
...Я работаю антинаучным аферистом...

bastii


нет я имел ввиду что-то типа того:

...
A a = new A;
a.Name = "A";
a.Kind ="Unknown";
List.Add(a);

B b = new B;
b.Name = "B";
b.Kind = "Unknown";
DoExtraWork(b); // This means ...
List.Add(b);

return List;

Ivan8209

Вот именно в таких случаях делают новые подпрограммы.
Это называется --- модульное программирование.
Повышает читаемость кода со всеми вытекающими.
---
...Я работаю антинаучным аферистом...

bastii

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

Ivan8209

Для этого придумали длинные имена и области видимости.
Ни про одно, ни про другое ООП не в курсе.
---
"Narrowness of experience leads to narrowness of imagination."
Rob Pike

durka82

Так в этом случае надо сделать нормальные конструкторы и написать так:
...
List.Add(new A("A","Unknown";
...
- или так:
...
B b = new B("B","Unknown");
DoExtraWork(b); // This means ...
List.Add(b);
...

durka82

Не надо гнать на ООП.
Вообще для нормального проганья надо знать не только последнюю технологию, но и ее предшественников.

Marinavo_0507


let a = name new_A "A" "Unknown"
and b = name new_B "B" "Unknown"
in
do_extra_work b;
[a; b]
Это если не заботиться о чистоте.

AVGO

я за первый вариант.. хотя прогал сначала 2. потом в конторе переучили, и спустя некоторое время осознал, что так лучше.. хотя это также на зависит от редактора в IDE, в MS VS 6.0 большие пробелы между строками ( больше чем в .NET ) там если использовать 2. очень размазывается код ( хотя видимо пробелы то как раз между строками настроить не проблема но что касается IDE еще одна фигня .NEt не любит первый стиль она его коряво собирает в блоки то так, то сяк...
а вообще есть к предложению маленькое дополнение: длина выражения внутри скобок if(...) !
если оно длинное и требует разбиения на несколько строк, то тут лучше переносить скобку ниже ( вариант 2 если оно короткое то первый вариант предпочтительней.
и еще бы стоило добавить вопрос стоит ли ставить скобки если внутри if'а одна строка.. я ставлю

lera98

Если на несколько строк, такие варианты:
1.
if(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzz){
aaaaaaa;
bbbbbbb;
}
2.
if (zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzz){
aaaaaaa;
bbbbbbb;
}
3.
if(zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzz)
{
aaaaaaa;
bbbbbbb;
}
Я за 3.

AVGO

все правильно..
3.- мой выбор

lera98

разветвляется, неразветвляется...

if(a){ // description
zzz;
if(b){ // description
zz;
zxzz;
}else{ // description
zrrr;
if(c){ // description
zecz;
zccvz;
}else if(d){ // description
zxcz;
}else{ // description
zwcz;
}// if(c)
}// if(b)
zz;
}// if(a)

lera98

Ещё про switch забыли:

// description of switch
switch(f){

// description of case
case 0:{
zzza;
}break;

// description of cases
case 1:
case 7:{
zzzb;
}break;

// description of case
case 2:{
zzzc;
}break;

// description of default case
default:{
zzzd;
}
}// switch(f)

lera98

Однако функции предпочитаю в таком виде:

//----------------------------------------------------------------------------
// func description
// params description
int func(ttt zzzzzz, tttt zzzz)
{
return 0;
}

//----------------------------------------------------------------------------
// func description
// params description
int func(ttttt zzzzzzzzzzzz, ttttt zzzzzzzzzzzzzz, tttttt zzzzzzzzzzzzz
tttttt zzzzzzzzzzzzz, ttttttttttt zzzzzzzzzzzzzz)
{
return 0;
}
Самый Любимый вид, когда на строки не жмусь:

//----------------------------------------------------------------------------
// func description
int func (
ttttt zzzzzzzz, // description
tttt zzzzz, // description
tttt zzzzzzzzzz, // description
tttttt zzzzzzz // description
)
{
return 0;
}

lord2476

да, вот только так впадлу дискрипшены писать
а вот // if(a) плльзуюсь постоянно

Valerik62

+1
открывающая и закрывающая скобки всегда на отдельной строке

koly

Я могу аргументировать, почему
if {
//code
}
хорошо и почему
if
{
//code
}
плохо
В 1-м варианте
а) экономится строчка, поэтому на экране отображается больше кода - это хорошо.
б) повышается читабельность, т. к. взгляд брошенный от "}" вверх натыкается сразу на оператор
Во 2-м, соответственно, мы имеем
а) потерянную строку
б) избыточную лишнюю информацию (на отдельной строке!) о том, что блок, оказывается, начинается с {. Как будто я и так этого не знал...
PS Контраргументы типа "во втором варианте четче видна структура линейного участка кода" считаю смешными.
PSS Думаю, что у многих любовь ко второму варианту - проявление тяжелого наследия visual studio, где, насколько я помню, 2-й вариант вставляется автоматически.

bobby

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

lera98

В вижле в свойствах эдитора всегда после установки таб со smart на block переключаю, + вставка пробелов, + виртуальный пробел - и никакого "тяжёлого" наследия : )

6yrop

второй вариант симметричнее (и открывающая, и закрывающая скобка на отдельной строке а значит красивше

6yrop

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

sergey_m

У нас в конторе рекомендуют не ставить.

koly

В ответ на:
и еще бы стоило добавить вопрос стоит ли ставить скобки если внутри if'а одна строка.. я ставлю
да, тоже актуальный вопрос, у нас в конторе заставляют всегда ставить скобки , единственным их аргумент: если потом потребуется поставить еще операторы, то можешь забыть окружить блок скобками. Но иногда заранее известно, что больше операторов не появится. А читабельность ухудшается....
У нас рекомендуют ставить. Объясняется тем, что
1. так проще отличить

if (...) {
//code
}
от
function_call(type1 arg1,
type2 arg2);
2. Упрощается ввод дополнительных операторов в полученный блок

lera98

if - это if. Вряд ли его можно спутать с вызовом функции, тем более с подсветкой синтаксиса.
Некоторые компиляторы позволяют такие записи:
if (f) a++, b++;
Для тривиальных выражений оч. полезная штука.
А для добавления нового оператора никогда не поздно оформить фигурными скобками.

garikus

/* osyntax.h */

#define IF(s) if (s)
#define THEN {
#define ELSIF(s) ; } else if (s)
#define ELSE ; } else {
#define END ; }
#define WHILE(s) while (s)
#define DO {
#define LOOP while(1) {
#define REPEAT do {
#define UNTIL(s) ; } while (!(s
#define BEGIN {
#define FOR(s) for (s)
/* example.c */

#include <stdio.h>
#include "osyntax.h"

#define M 11
#define N 32

void power_of_2
{
int z, j, k, exp, c, r, t;
int d[M], f[N];

d[0] = 1; k = 1;
FOR (exp = 1; exp <= N; exp++) DO
c = 0;
FOR (z = 0; z < k; z++) DO
t = 2 * d[z] + c;
IF (t >= 10) THEN
d[z] = t - 10; c = 1
ELSE
d[z] = t; c = 0
END
END;
IF (c > 0) THEN
d[k] = 1; k++
END;
z = M;
REPEAT
z--;
printf(" ")
UNTIL (z == k);
REPEAT
z--;
printf("%d", d[z])
UNTIL (z == 0);
printf(" %d 0.", exp);
r = 0;
FOR (j = 1; j < exp; j++) DO
r = 10 * r + f[j]; f[j] = r / 2;
r = r % 2; printf("%d", f[j])
END;
f[exp] = 5; printf("5\n")
END;
}

int main
{
power_of_2;
}
IF (x < 0) THEN
printf("x < 0\n")
ELSIF (x > 0) THEN
printf("x > 0\n")
ELSE
printf("x = 0\n")
END;

bleyman

>Некоторые компиляторы
Все вообще-то. Если не позволяет, то это не компилятор С/С++.
Оставить комментарий
Имя или ник:
Комментарий: