LINUX.ORG.RU

Почему в индустрии победил стиль скобок Си на одной строке?

 ,


0

1

Как человек, который много писал на паскале, я довольно быстро пришел к форме:

if condition then
begin
  ...
end;
как наиболее универсальной записи, которая, к тому же, еще и каноничная. Если мы посмотрим на ядро линупса, то увидим довольно интересные вещи:
int crypto_register_acomps(struct acomp_alg *algs, int count)
{
	int i, ret;

	for (i = 0; i < count; i++) {
		ret = crypto_register_acomp(&algs[i]);
		if (ret)
			goto err;
	}
Эм-м-м, чо? Почему в одной функции скобка на новой строке и не на новой? Или, вот, например, стиль гугля для крестов:
int ClassName::ReallyLongFunctionName(int par_name1, int par_name2,
                                      int par_name3) {
  DoSomething();
  ...
}
Может я просто не знаком с крестами и не понимаю, как такая запись резонирует с привычками крестовиков, но на мой сишно-паскальный взгляд такая такой стиль вырвиглазен, поскольку в нем «DoSomething» непонятно к чему относится. Некоторые люди приходят к стилю:
int ClassName::ReallyLongFunctionName(int par_name1, int par_name2,
                                      int par_name3) {

  DoSomething();
  ...
}
который на самом деле так и просит перенести эту чертову скобку на новую строку, которую ты уже и так сделал.

Тот же Qt переносит скобку на новую строку для классов и функций, но не делает этого для условий-циклов.

Единственное оправдание, которое я вижу для крестовиков — это инициализаторы, которые пишутся одной строкой. Ну так пишите их одной строкой, когда они влазят в одну строку. Сишники в итоге все-таки пришли к тому, что фигурная скобка для функций должна быть строго на новой строке — я хз, почему этот стиль нельзя по логике распространить и на условия с циклами, я просто не вижу никакого оправдания для размещения фигурной скобки на одной строке с условием-циклом. Может вы его видите.

★★★★

Ответ на: комментарий от anonymous

Ээээ, я не Linux-нутый не Windows-нутый, не - «Гусарам молчать!».

Одного не пойму, кого отнести к "остроконечникам" и "тупоконечникам" - Linux-нутых или Windows-нутых?

Владимир

anonymous
()

всегда пишу:

if(bool){
  ...
}
else{
  ...
}

while(bool){
  ...
}

void ff(){
  ...
}

Class::Class(int fx, int fy): _x(fx), _y(fy){
  ...
}

формальный параметр всегда начинается с f
int ff(int fx, int fy);
локальная переменная - с l

int ff(int fx){
  int lx = fx;
  return lx;
}

переменная класса с _
int Class::ff(int fx){
  int lx = fx;
  _x=fx;
  return _x;
}
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от anonymous

После первого ответа

Дело вкуса, вобщем-то.

Тему можно было бы и закрыть.

Владимир

anonymous
()

я просто не вижу никакого оправдания для размещения фигурной скобки на одной строке с условием-циклом.

Смiсл придуман для того, чтоб ты его не понимал (С) мiшаня кукурузон.

nikitos ★★★
()
Ответ на: комментарий от anonymous

Интересно было бы посмотреть

Даёшь голосование! Или уже было, кажется?

no-such-file ★★★★★
()

А ответ-то прост, перенос скобки — признак рака мозга. Когда рака нет, скобка не переносится.

Другие признаки рака мозга:

if ... {
  return ...;
} else { 
  return ...;
}
  ...
} else {
  if ... {
    ...
  }
}
WitcherGeralt ★★
()

K&R стиль (те самые скобки на той же строке) экономит место. На небольших экранах это особенно заметно, но и на больших экономия очень даже в тему. Я, например, терпеть не могу перенос скобок на новую строку (ноут 14").

nrader
()

Ну теперь понятно, откуда у тебя с гитом проблемы, раз даже сраная скобка вызывает такой диссонанс.
В той теме так и не ответил - работы много навалилось, ну и черт с ним. Мои извинения.

cherry_boy
()
Ответ на: комментарий от no-such-file

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

} else {

Shadow ★★★★★
()
Ответ на: комментарий от dyb4hzvo

Скобка на новой строке, на мой взгляд, лучше выделяет блок и добавляет единообразия.


Ну еще и подсвечивать закрывающую скобку удобнее (если, допустим, в vim кодишь, или просто зашел код глянуть)

Myp3ik ★★
()

в инструкции по code style к ядру линуса четко и однозначно написано, как именно привязывать к столбу людей, задающих такие вопросы и какие именно дрова лучше всего помогают справиться с такой ересью.

За редким исключением code style такая же жизненно-важная и не имеющая никаких причин вещь, как выбор стороны движения. Неважно по какой стороне дороги ездить, важно чтобы абсолютно все придерживались одного решения.

max_lapshin ★★★★★
()
Ответ на: комментарий от Shadow

после питона

Там видимо смысл был в том, что бы else был выровнен как в питоне, на один уровень с if и при этом максимально спрятать скобочки. Ты наверное не настоящий питонист.

no-such-file ★★★★★
()
Ответ на: комментарий от Myp3ik

Ну еще и подсвечивать закрывающую скобку удобнее

А ещё удобнее использовать что-нибудь вроде Кати, в которой работа с блоками просто фантастически удобна.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

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

gremlin_the_red ★★★★★
()
Ответ на: комментарий от fsb4000

В паскале тоже часто пишут begin на той же строке:

Антипример:

var i : integer;
function rock(hard: boolean); begin
   for i := 1 to 10 do begin
       //do something
   end;
end;

Пример из кода проекта, в котором я участвовал (я сам такого бы не написал):

function GetFilterList: TcxFilterCriteriaItemList;
begin
  with Self do begin
    if (Filter.Root.BoolOperatorKind = fboOr) or
      (Filter.Root.BoolOperatorKind = fboAnd) and (Length(AIndexes) = 1) then
      Result := Filter.Root
    else
      Result := Filter.Root.AddItemList(fboOr);
  end;
end;

В итоге begin на той же строке приводит к отвратительной читаемости, и даже стронники такого подхода приходят к тому, что для функций и секций «var» нужно обязательно делать переносы строк.

byko3y ★★★★
() автор топика
Ответ на: комментарий от dyb4hzvo

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

Да, вполне возможно, что в Java и C++ такой подход победил из-за засилия однострочных функций. Фундаментальная ущербность этих языков неустранима — ее пытаються решать как получается. Хотя, лично я бы все-таки предпочел делать геттеры-сеттеры вообще на одной строке, аля

public class SimpleGetterAndSetter {
    private int number;
 
    public int getNumber() { return this.number; }
 
    public void setNumber(int num) { this.number = num; }
}
Собсна, примерно так в крестах и пишут.

Скобка на новой строке, на мой взгляд, лучше выделяет блок и добавляет единообразия

Вот именно — единобразие! Для чего вообще создаются стили - для единобразия. Скобка на той же строке либо делает читаемость отвратительной, либо приводит к отсутствию единообразия.

byko3y ★★★★
() автор топика
Ответ на: комментарий от Lrrr

Со скобкой на новой строке лично для меня это превращается в «объявление функции - начало блока с кодом - блок с кодом - конец функции». Неприятно
Это гораздо лучше делать просто пустой строкой, а не скобкой

Быстрое чтение кода не подразумевает чтения параметров, и порой даже не подразумевает чтения имени функции, поскольку я его просто-напросто не помню — я читаю только код, но мне приходится разбираться, где он начинается. То, что ты описываешь, больше похоже на «я привык», я же пишу про объективные критерии, такие, как визуальное слияние параметров функции с телом или слияние условий перехода с условным кодом. В итоге ты все равно подтверждаешь необходимость визуального интервала, но аргументируешь это тем, что ты привык к пустой строке, а не скобке на ней.

byko3y ★★★★
() автор топика
Ответ на: комментарий от x3al

Всё прекрасно видно по отступам, зачем скобки?

Oh rly?

for dpath, dirList, fileList in os.walk(inPath, topdown=False):
    for ff in fileList:
        if (ff == ".htaccess") or \
                (ff == ".DS_Store") or \
                re.search(r"^xx", ff) or \
                re.search(r"^#.+#$", ff) or \
                # re.search(r"~$", ff) or \
                re.search(r"^xx", ff):
            print("◆", ff)

byko3y ★★★★
() автор топика
Ответ на: комментарий от quantum-troll

Очевидно, что второй стиль лучше, так как удволетворяет принципу близости

Это прям типичный пример абстрактных коней в вакууме. Потому что реальный код не существует в вакууме, и ближе-дальше всегда относительно чего-то. И это что-то будет тоже отделено от всего блока условия, потому принцвип близости не нарушен. К слову, писать однострочники без скобок я не запрещал, этот стиль вполне себе приветствуется как в паскале. так и в Си.

byko3y ★★★★
() автор топика
Ответ на: комментарий от Nervous

Всё прекрасно видно по отступам, зачем скобки?

Все прекрасно видно по sexp-ам, зачем отступы?

Лично у меня не получается читать однострочные s-espression-ы, потому что глаза рябит от множества скобок — приходится переносить строку и делать отступы.

byko3y ★★★★
() автор топика
Ответ на: комментарий от anonymous
if ... {
  ...
} else {
  ...
}

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

byko3y ★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Стиль, может и должен плавать, и выражать части кода, а не пропихивать под стиль код

У меня тоже когда-то были такие идеи, но со временем я пришел к тому, что возможность подсознательно распознавать вспомогательные конструкции и читать сам алгоритм — это круто и удобно. И да, можно использовать нестандартные конструкции для нестандартного кода, как раз для того, чтобы глаз об них спотыкался.

Так лучше

int ClassName::ReallyLongFunctionName(int par_name1,
                                      int par_name2,
                                      int par_name3) 
{
  DoSomething();
  ...
}

Или хоть так.

int ClassName::ReallyLongFunctionName(int par_name1, int par_name2,
                                      int par_name3, int par_name4) {
  DoSomething();
  ...
}

Мне оба варианта нравятся, даже несмотря на то, что я сторонник скобки на новой строке. Поясню:

int somefunc(int par_name1, int par_name2,
             int par_name3, int par_name4) {
  DoSomething();
  ...
}

Здесь четко выделена фигурная скобка в конце - ее хотя бы как-то можно словить, плюс по отступам ориентироваться. В принципе, можно было бы замутить что-то такое для трех аргументов:

int somefunc(int par_name1, int par_name2,
             int par_name3)                {
  DoSomething();
  ...
}

byko3y ★★★★
() автор топика
Ответ на: комментарий от quantum-troll

Нет этого уродливого съехавшего else

if (cond)
  code1;
else
  code2;

Или

if(cond)
{
  code1;
  ...
}
else
{
  code2;
  ...
}

byko3y ★★★★
() автор топика
Ответ на: комментарий от anonymous

Пишу вот так:

if ...    {
   ...    }
else      {
   ...    }
Это стиль «зачем мне тут скобки, когда есть отступы». Тоже имеет право на жизнь, однако, как ты пишешь длинные условия и аргументы?

byko3y ★★★★
() автор топика
Ответ на: комментарий от jo_b1ack

часто так делаю тоже, потому что это более читабельно чем одинока скобка, да и при фолдинге в редакторе сворачивается нормально

Эм-м-м... пардон, а во что она всорачивается? В

int ClassName::ReallyLongFunctionName(int par_name1, int par_name2,
                                      int par_name3) {
? Или же все таки редактору приходится убирать скобку в конце?

byko3y ★★★★
() автор топика
Ответ на: комментарий от Myp3ik

Ну еще и подсвечивать закрывающую скобку удобнее (если, допустим, в vim кодишь, или просто зашел код глянуть)

Да, фигурная скобка на новой строке в том числе лучше взаимодействует с инструментами.

byko3y ★★★★
() автор топика
Ответ на: комментарий от max_lapshin

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

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

byko3y ★★★★
() автор топика

Почему это ещё обсуждается в 2020? Давно есть LLVM/Google/Mozilla/… стайлгайды. Выбирай, который по душе.

В нормальных языках есть _lang_fmt, который приведёт код к единому идиоматическому стилю.

rbbtnspc
()
Последнее исправление: rbbtnspc (всего исправлений: 1)

учил сишечку напару с winapi, а там allman style

так и пишу, что в си, что в плюсах, что в c#

lovesan ★★
()
Ответ на: комментарий от Shadow

поэтому

} else {

Я вроде понемаю, что идеологически правильнее перенести else на новую строку, но так почему-то красивее.

О! Придумал отмазку! Else не является самостоятельным блоком, поэтому не заслуживает новой строки.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от byko3y

Эм-м-м... пардон, а во что она всорачивается?

да сворачивается в заголовок функции без скобки в конце.

int ClassName::ReallyLongFunctionName(int par_name1, int par_name2,
                                      int par_name3) {

jo_b1ack ★★★★★
()

Есть code style вообще-то и пишется в нём, у каждого проекта он свой. Стиль гугля вполне себе адекватен, как и стиль ядра линукса. Угадай почему там так скобки стоят.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Стиль гугля вполне себе адекватен, как и стиль ядра линукса. Угадай почему там так скобки стоят

Я вообще-то в исходном сообщении и задавал вопрос: почему? Я делаю ставку на то, что сделали голосование/аудит сорцов по использованию того или иного стиля, победило то, что мы видим в гайде.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

цикл, а не функция, для выравнивания IDE умеют рисовать линии вертикальные, если так уж сильно нужно.

peregrine ★★★★★
()

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

func crypto_register_acomps(acomp_alg *struct algs, count int) : int {
	var i, ret : int;
	for (i = 0; i < count; i++) {
		ret = crypto_register_acomp(&algs[i]);
		if (ret)
			goto err }}

Заодно я приблизил стиль к голангу.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от byko3y

нет неправильной стороны движения на дороге. Это на самом деле пофиг: ездить слева или справа. Но надо чтобы все договорились об одном.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

нет неправильной стороны движения на дороге. Это на самом деле пофиг: ездить слева или справа. Но надо чтобы все договорились об одном.

Если у тебя в авто руль слева, то правильная сторона движения - правая. В нашем случае автомобиль с левым рулем - это C/C++/Pascal, их поменять не получится, но можно правильно ездить на них.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

так руль ставится под выбранную сторону движения =)

max_lapshin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.