단일 결정 및 작업 설명에 선호되는 스타일은 무엇입니까?
-
08-06-2019 - |
문제
다음 예와 같이 괄호 없이 단일 결정과 동작을 지원하는 언어의 경우:
if (var == true)
doSomething();
이것을 작성하는 데 선호되는 방법은 무엇입니까?대괄호는 항상 사용해야 합니까, 아니면 개별 개발자의 선호에 따라 그 사용법을 남겨 두어야 합니까?또한 이 방법은 다음 예와 같이 코드 블록의 크기에 따라 달라지나요?
if (var == 1)
doSomething(1);
else if (var > 1 && var < 10)
doSomething(2);
else
{
validate(var);
doSomething(var);
}
해결책
사실 정답은 없습니다.이것이 회사 내 코딩 표준의 목적입니다.회사 전체에서 일관성을 유지할 수 있다면 읽기 쉬울 것입니다.나는 개인적으로 좋아한다
if ( a == b) {
doSomething();
}
else {
doSomething();
}
그러나 이것은 성전이다.
다른 팁
나는 추천한다
if(a==b)
{
doSomething();
}
왜냐하면 성공 조건에 두 번째 명령문을 추가할 때 중괄호를 추가하는 것을 기억하려고 노력하는 것보다 미리 수행하는 것이 훨씬 쉽다는 것을 알았기 때문입니다.
if(a==b)
doSomething();
doSomethingElse();
와는 매우 다르다
if(a==b)
{
doSomething();
doSomethingElse();
}
보다 조엘의 기사 자세한 내용은
나는 항상 교정기를 사용하는 경향이 있습니다.다음과 같이 시작한 부분에서 미묘한 버그가 발생할 수 있습니다.
if(something)
DoOneThing();
else
DoItDifferently();
그런 다음 다른 작업을 추가하기로 결정합니다. else
절을 작성하고 중괄호로 묶는 것을 잊어버렸습니다.
if(something)
DoOneThing();
else
DoItDifferently();
AlwaysGetsCalled();
AlwaysGetsCalled()
항상 전화를 받을 것이고, 새벽 3시에 거기 앉아 코드가 왜 이상하게 행동하는지 궁금해한다면, 그런 일이 꽤 오랫동안 당신을 피할 수 있습니다.이런 이유로 나는 항상 교정기를 사용합니다.
내가 선호하는 것은 일관성을 유지하는 것입니다. 예를 들어 한 블록에 대괄호를 사용하는 경우 단 하나의 명령문에도 전체적으로 대괄호를 사용하십시오.
if (cond1)
{
SomeOperation();
Another();
}
elseif (cond2)
{
DoSomething();
}
else
{
DoNothing();
DoAnother();
}
하지만 라이너가 하나만 있는 경우:
if (cond1)
DoFirst();
elseif (cond2)
DoSecond();
else
DoElse();
그렇게 하면 더 깨끗해 보이지만(더미 메서드 이름이 마음에 들지 않는다면;) 그게 바로 나입니다.
이는 루프 구성 등에 적용됩니다.
foreach (var s as Something)
if (s == someCondition)
yield return SomeMethod(s);
또한 이는 .NET에 더 적합할 수 있는 규칙이라는 점도 고려해야 합니다(Java peepz는 if와 같은 줄에 첫 번째 중괄호를 사용하는 것을 좋아합니다).
경험이 부족해서라고 생각하지만, 제가 7년 동안 코드 몽키로 일하는 동안 절대 실제로 중괄호가 없는 블록에 코드를 추가할 때 중괄호를 추가하지 않는 실수를 하는 사람을 본 적이 있습니다.바로 그거야 영 타임스.
그리고 재치 있는 말을 하기 전에는, 그 이유는 "모든 사람이 항상 중괄호를 사용한다"는 것이 아니었습니다.
그래서 솔직한 질문입니다. 저는 단지 반대표 대신에 실제 답변을 받고 싶습니다.실제로 그런 일이 일어나나요?
(편집하다:나는 조금 더 명확히 하기 위해 아웃소싱에 대한 공포 이야기를 충분히 들었습니다.실제로 그런 일이 일어난 적이 있나요? 유능한 프로그래머?)
일관성을 유지하는 한 실제로는 중요하지 않습니다.
단일 진술 내에서 동일성을 요구하는 경향이 있는 것 같습니다.한 가지에 대괄호가 있으면 모든 곳에 대괄호가 있습니다.Linux 커널 코딩 표준에서는 이를 의무화합니다.
강력하게 옹호하겠습니다 언제나 선택 사항인 경우에도 중괄호를 사용합니다.왜?다음 C++ 코드 덩어리를 살펴보세요.
if (var == 1)
doSomething();
doSomethingElse();
이제 실제로 충분히 주의를 기울이지 않고 (var == 1)인 경우 추가 작업이 필요하다고 판단하는 누군가가 와서 다음과 같이 합니다.
if (var == 1)
doSomething();
doSomethingExtra();
doSomethingElse();
모두 여전히 아름답게 들여쓰기되어 있지만 의도한 대로 작동하지 않습니다.
항상 중괄호를 사용하면 이런 종류의 버그를 피할 가능성이 더 높습니다.
나는 개인적으로 Code Complete의 McConnell의 설명에 동의합니다.
가능할 때마다 사용하십시오.코드의 가독성을 높이고 발생할 수 있는 혼란을 거의 제거합니다.
하지만 더 중요한 것이 하나 있습니다....일관성.어떤 스타일을 사용하든 항상 같은 방식으로 사용하세요.
다음과 같은 글을 쓰기 시작하세요:
If A == true
FunctA();
If B == "Test"
{
FunctB();
}
당신은 컴파일러가 당신이 하려는 일을 이해하지 못하고 찾기 어려운 이상한 버그를 찾게 될 것입니다.
기본적으로 매번 쓰기 편한 것을 찾아서 고수하세요.나는 가능한 한 블록 구분 기호('{', '}')를 사용하는 것이 좋다고 믿습니다.
나는 다른 질문을 시작하고 싶지 않지만, 당신의 정신적 주스가 흐르도록 언급하고 싶은 것과 관련된 것이 있습니다.하나는 브래킷을 사용하기로 결정한 것입니다.오프닝 브라켓은 어디에 두나요?진술과 같은 줄 또는 그 아래.들여쓰기된 괄호인지 아닌지?
If A == false {
//calls and whatnot
}
//or
If B == "BlaBla"
{
//calls and whatnot
}
//or
If C == B
{
//calls and whatnot
}
이것은 새로운 질문이므로 대답하지 마십시오.이에 관심이 있으면 귀하의 의견에 새로운 질문을 열겠습니다.
C에서 필요한 것처럼 변수를 해제하기 전에 NULL인지 확인하는 경우를 제외하고는 항상 대괄호를 사용했습니다.
이 경우 다음과 같이 모든 내용을 한 줄에 유지하여 단일 명령문임을 분명히 합니다.
if (aString) free(aString);
위의 진술을 작성하는 데에는 옳고 그른 방법이 없습니다.허용되는 코딩이 많이 있습니다. 스타일.그러나 저는 전체 프로젝트에 걸쳐 코딩 스타일을 일관성 있게 유지하는 것을 선호합니다.즉.프로젝트가 K&R 스타일을 사용하는 경우 K&R을 사용해야 합니다.
Ruby는 토론에서 한 가지 문제를 훌륭하게 제거했습니다.단일 라이너의 표준은 다음과 같습니다.
do_something if (a == b)
여러 줄의 경우:
if (a == b)
do_something
do_something_else
end
이렇게 하면 한 줄로 된 명령문을 간결하게 작성할 수 있지만 한 줄에서 여러 줄로 이동하는 경우 명령문을 재구성해야 합니다.
이것은 (아직) Java나 다른 많은 언어인 AFAIK에서는 사용할 수 없습니다.
다른 사람들이 언급했듯이 중괄호 없이 두 줄로 if 문을 사용하면 혼란을 초래할 수 있습니다.
if (a == b)
DoSomething();
DoSomethingElse(); <-- outside if statement
그래서 가독성을 해치지 않으면서 한 줄에 배치합니다.
if (a == b) DoSomething();
그 외의 경우에는 항상 교정기를 사용합니다.
삼항 연산자는 약간 다릅니다.대부분의 경우 나는 한 줄로 작업을 수행합니다.
var c = (a == b) ? DoSomething() : DoSomethingElse();
그러나 때때로 진술은 기능 호출 또는 람다 표현식으로 한 줄 진술을 시각적으로 구문 분석하기 어렵게 만들었으므로 다음과 같은 선호합니다.
var c = (a == b)
? AReallyReallyLongFunctionName()
: AnotherReallyReallyLongFunctionOrStatement();
if/else 블록보다 훨씬 더 간결하지만 무슨 일이 일어나고 있는지 쉽게 알 수 있습니다.
썬의 Java 프로그래밍 언어에 대한 코드 규칙 가지다 이것 말하다:
IF-ELSE 클래스의 진술에는 다음 양식이 있어야합니다.
if (condition) { statements; } if (condition) { statements; } else { statements; } if (condition) { statements; } else if (condition) { statements; } else { statements; }
우리 상사는 그것이 단 하나의 명령문이더라도 결정문 뒤에 { }를 붙이도록 합니다.두 줄을 추가하는 것은 정말 짜증나는 일입니다.유일한 예외는 삼항 연산자입니다.
코드 모니터를 1200x1600의 세로 방향으로 두는 것이 좋은 것 같습니다.
나는 선호한다
if (cond)
{
//statement
}
단 하나의 진술만으로도.무언가를 한 번 작성하려고 했고, 그것이 작동하는지 의심하지 않았으며, 다른 코더가 해당 코드를 볼 계획이 없었다면 계속해서 원하는 형식을 사용하십시오.그러나 추가 브라케팅으로 인해 실제로 드는 비용은 얼마입니까?이 게시물을 작성하는 데 걸리는 시간보다 1년이 더 짧습니다.
예, 저는 괄호를 블록 수준까지 들여쓰는 것을 좋아합니다.
파이썬은 들여쓰기가 블록을 정의한다는 점에서 좋습니다.그런 언어에서는 문제가 문제입니다.
나는 그 기사에 관한 Joel Spolsky의 의견에 동의하는 경향이 있습니다.잘못된 코드를 잘못된 것처럼 보이게 만들기) 다음 코드 예제를 사용하면 다음과 같습니다.
if (i != 0)
bar(i);
foo(i);
Foo는 이제 무조건적입니다.정말 나쁘다!
나는 항상 결정문에 대괄호를 사용합니다.이는 코드 유지 관리에 도움이 되며 코드에 버그가 발생할 가능성이 줄어듭니다.
저는 모든 문장 주위에 중괄호를 사용합니다. 문장 중 적어도 하나가 필요할 경우에만요.
Perl에서는 간단한 테스트를 수행하는 경우 다음 형식으로 작성하게 됩니다.
do_something if condition;
do_something unless condition;
서브루틴 시작 시 인수를 확인하는 데 정말 유용할 수 있습니다.
sub test{
my($self,@args) = @_;
return undef unless defined $self;
# rest of code goes here
}
황금률은 기존 프로젝트에서 작업할 때 해당 코딩 표준을 따르는 것입니다.
집에 있을 때는 두 가지 양식을 가지고 있습니다.
첫 번째는 한 줄입니다.
if (condition) doThis();
두 번째는 여러 줄에 대한 것입니다.
if (condition) {
doThis();
}
나는 apparatchik처럼 "항상 중괄호 사용" 줄을 따르곤 했습니다.그러나 한 줄 조건식에서는 생략할 수 있도록 스타일을 수정했습니다.
if(!ok)return;
모든 다중 문 시나리오에서는 여전히 중괄호가 필수라고 생각합니다.
if(!ok){
do();
that();
thing();
}