자주 사용하는 프로그래밍 언어에서 어떤 구문 요소를 가장 싫어합니까? [닫은]


27

프로그래밍 언어를 아무리 좋아하더라도 항상 그다지 좋지 않은 세부 사항이 몇 가지 있습니다.

이 질문에서는 구문 요소 에 특별히 초점을 맞추고 싶습니다 . 자주 사용하는 프로그래밍 언어 (아마도 가장 좋아하는 프로그래밍 언어 또는 직장에서 사용해야하는 언어)에서 가장 읽을 수 없거나, 명확하지 않거나, 불편하거나 불쾌한 구문 요소는 무엇입니까?


@Nathan Taylor는이 질문에 대한 것이 아니라 다른 질문에 대한 것 입니다.
finnw

이 질문이 수정 되었습니까? 대답 할 때 "구문 요소"에 중점을 두지 않았기 때문에 지금 답을 수정해야합니다.
Talvi Watia

@Talvi : 아니요, 처음부터 구문에 관한 것이 었습니다.
Timwi

@Timwi는 이상합니다. '다른 질문이라고 생각하는 질문에 대답하는'경우 여야합니다.
Talvi Watia

투표 할 수 있고 이것이 유용한 질문이거나 아래에 유용한 답변이 있다고 생각되면 투표하십시오. 좋은 커뮤니티를 구축하려면 StackExchange 사이트에 투표가 필요합니다. 하루에 30 표를 낼 수 있고 낭비하지 마십시오. 명성이 높고 계산 횟수가 적은 사용자는 다음을 읽어보십시오. meta.programmers.stackexchange.com/questions/393/…
Maniero

답변:


39

JavaScript에서 세미콜론 삽입

나는 종종 그것을 자주 물지 않았지만 그것은 단지 머리가 돌게 만드는 엄청나게 나쁜 생각입니다.


규칙은 다음과 같습니다 (ECMA-262 섹션 7.9 참조).

  1. 프로그램에 공식 문법에서 허용되지 않는 토큰이 포함 된 경우 (a) 해당 지점에 줄 바꿈이 있거나 (b) 예기치 않은 토큰이 닫는 중괄호 인 경우 세미콜론이 삽입됩니다.
  2. 파일 끝에 도달하면 프로그램을 구문 분석 할 수 없으면 세미콜론이 삽입됩니다.
  3. "제한된 생산"이 발생하고 문법에 "[No LineTerminator 없음]"주석이 포함 된 위치에 줄 종결자가 포함 된 경우 세미콜론이 삽입됩니다.

예:

return 1; // returns 1

return
1; // returns undefined

2
JavaScript : 세계에서 가장 오해 된 프로그래밍 언어 ~ Douglas Crockford
pramodc84

그렇습니다. 많은 사람들이 JavaScript가 "자유 언어"가되기를 기대하지만 그렇지 않습니다.
Andreas Rejbrand

13
JavaScript가 HTML을 작성하도록 설계되었다는 사실을 이해하면 구문 적으로 유효하지 않을 때 코드가 실제로 의미하는 바를 해석하려는 오랜 역사가 있습니다. (언제나 컴퓨팅 역사상 가장 큰 재난 인 견고성 원칙을 찾아보십시오.)
Mason Wheeler

7
나에게 이런 유형의 오류는 프로그래머가 느슨하고 일반적으로 세미콜론을 남기는 데 구문 오류가 발생하는 가장 공식적인 "엄격한"언어로 작업 한 적이없는 코드 냄새입니다.
Talvi Watia

7
Wohoo, 마지막으로 견고성 원칙을 생각하는 다른 사람은 HTML을 완전히 혼란스럽게 만드는 재앙이라고 생각합니다.
Roman Starkov

39

C # 특성 부족으로 인한 Java Bean 구문

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

GAH !!!

내가 가진 문제

  • 너무 많은 코드 -문서화 된 필드, 문서화 된 getter 메소드 및 문서화 된 setter 메소드가 있습니다. 이 기본 예제에는 단일 속성에 대한 20 줄의 코드가 있습니다.
  • 클러 방법 목록 : - "나에 그 방법, 손으로 찾아 보자 getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH, ... 아, 거기입니다 hashCode.
  • 여러 영역의 문서로 인해 문서가 열악하거나 오래되거나 누락되었습니다 -코드의 기능을 이해하려고 할 때 성가신
  • 그래서 괴롭히지 3 파티가 쉽게 할 수있는 플러그인을 마련했다 - 스푼 , 상어 , 다른 사람의 사이에서.

9
코드가 너무 장황하여 자동 생성 도구가 필요한 경우에도 문제가 있습니다. 나는 NetBeans 사람이지만 getter 및 setter를 자동으로 생성하는 기능도 있습니다. 그러나 Javadoc은 syn에서 빠지고, 여전히 장황하고, 여전히 javadoc 등을
어수선하게합니다.

11
모든 것에 게터가 필요하면 클라이언트 코드에 문제가 있습니다.
finnw

7
게터와 세터가 있으면 캡슐화가 중단됩니다. 이 필드는 뿐만 아니라 수 있을 public. 멤버는 비공개이어야하며 클라이언트 코드의 getter 및 setter가 아닌 상위 수준의 논리를 사용하여 클래스에서 현명하게 조작해야합니다 .
greyfade

6
@greyfade : 공개 인 경우 설정 코드의 기능을 쉽게 변경할 수 없습니다 (필드를 외부에서 설정하는 모든 코드를 변경해야 함).
Bart van Heukelom

3
@ SHiNKiROU : Java가 깨끗해 보입니까? 전에는 들어 본 적이 없습니다! Java에 대한 나의 주된 관심은 단순한 것처럼 보이는 것은 정신적으로 무시해야 할 수십 줄의 코드를 필요로한다는 사실입니다.
구성자

33

공백 감도.

파이썬은 이런 점에서 나를 귀찮게합니다. 어쨌든 제대로 들여 쓰기가 필요하지만 버그가 있습니다 . 구문의 표현 부분을 만드는 것은 저를 자극합니다.


8
당신은 그것을 사랑하는 법을 배울 것입니다
user10008

2
구문 프리젠 테이션
Winston Ewert

32

switch문 (C, C에서 + +, C #을, 자바, 등)

다음은 내가 매우 불편한 이유의 예입니다.

switch (someVariable)
{
    case 1:
        int i = something();
        doSomething(i);
        break;

    case 2:
        int i = somethingElse();
        doSomethingElse(i);
        break;
}

변수 i가 동일한 범위에서 다시 선언 되기 때문에 컴파일되지 않습니다 . 이것은 사소한 세부 사항처럼 보이지만 정말 자주 물립니다. 중괄호를 추가하여 완화시킬 수 있지만 중괄호가 구문의 필수 부분이었고 여분의 들여 쓰기 수준이 없으면 좋을 것입니다. 나는 또한 여분을 작성하는 것이 정말 싫어 break. 이것은 훨씬 좋을 것입니다 :

switch (someVariable)
case 1
{
    int i = something();
    doSomething(i);
}
case 2
{
    int i = somethingElse();
    doSomethingElse(i);
}
default
{
    ...
}

이것은 if/ elsechain 처럼 보이게 합니다. 시맨틱 적으로 비슷하기 때문에 좋은 것입니다. 적어도 C #에서는 여전히 똑같은 것은 아니지만 switch명령문에서 케이스 레이블의 순서는 중요하지 않지만 if/ else에서는 중요합니다.


1
불행히도, 개선 된 구문은 대부분의 언어에서 폴 스루 (Fall-through)라는 스위치의 가장 큰 특징을 제거합니다. C의 "더프 장치"는이 특정 "미스 피처"의 가치를 보여주는 완벽한 예입니다. C와 같은 언어에서는 통역사 및 유사한 프로그램에서 대체를 사용하는 것이 일반적입니다.
greyfade

7
아니, 그것을 멀리하지 않습니다. goto이미 C #에서와 같이 더 명확하게 ( 또는 유사한 것을 사용하여 ) 만들면됩니다.
Timwi

8
@greyfade : C에서 더프 장치를 사용하는 모든 코드는 끔찍한 죽음으로 사망해야합니다. 컴파일러는 이러한 것보다 더 나은 결정을 내립니다.
Billy ONeal

4
@greyfade : 델파이는 다음과 같이 여러 인덱스를 허용함으로써 여러 값 문제를 해결합니다 case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;.
Frank Shearar

3
@jkerian : 이제 break기본값이었고 상상할 필요 가 있다고 상상해보십시오 . 더 이상 언급 할 필요가 없습니다! :)
Timwi

27

VB.NET의 배열 선언

VB.NET에서 고정 배열을 초기화 할 때 C / C ++, PHP 또는 Java와 같은 요소 수가 아닌 배열의 상한을 지정한다는 것을 항상 잊어 버립니다 . VB6 외에도 (우리는 거기에 가지 않을 것입니다 ...), 나는 이런 식으로하는 다른 언어를 생각할 수 없습니다.

Dim myArray(20) as Integer  '# Creates an array with 21 elements,
                            '# indexed from 0 to 20

나는 모든 BASIC 언어가 이것을한다고 생각합니다 ... 나는 원래의 BASIC과 QBasic 이하는 것을 알고 있습니다.
Michael K

정말 끔찍한 세상에 .... +1
mikera

25

VB6-개별 변수 선언 및 할당

대부분의 언어에서는 변수를 선언하고 한 줄의 코드로 변수를 할당 할 수 있습니다. 반면에 VB6은 두 가지를 사용하도록합니다.

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

콜론을 사용하여 두 개의 명령을 한 줄에 넣을 수 있지만 실제 코드에서는 빠르게 혼란스러워집니다.

Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection

7
VB6을 가장 자주 사용하는 언어로 +1해야합니다.
Walter

9
매일 사용하고 있습니다.
systempuntoout

파스칼에는 비슷한 문법이 없습니까? 나는 항상 그것이 불쾌하다고 생각했다.
greyfade

1
특별한 경우가 있습니다 : Dim Hurp As New Collection, Hurp참조 할 때 액세스하면 액세스 Nothing하기 전에 마술처럼 초기화됩니다. 명시 적으로 설정하고 Nothing다시 터치하면 부활됩니다 ...
Jeffrey Hantin

1
Derp에 +1 백만 Derp de derp 깨끗하게 tum de derp.
MVCylon

24

CSS에서 주석 달기

//PHP 및 Javascript와 같은 다른 많은 언어에서와 같이 코드 줄을 주석 처리하지 않습니다. /* this is commented out */작동 하지만 을 사용하는 것을 선호합니다 //.

절반의 시간이 CSS를 편집하는 것을 잊고 돌아가서 오류를 수정해야하기 때문에 귀찮습니다.


요즘에는 원시 CSS가 객체 코드로 간주 될 것이라고 생각할 것입니다.
Tom Hawtin-tackline

// CSS를 주석 처리하기 위해 잘 작동합니다. 나는 항상 그것을한다. 내가 정말로하고있는 일은 쓰레기를 입력하는 것입니다. 그러나 파싱 할 수없는 줄을 건너 뛰면 효과가있는 것 같습니다.
MVCylon

1
@MVCylon //를 사용하여 행을 주석 처리하면 다음 행 뒤의 항목도 건너 뜁니다. {특정 스타일 내} 다시 말하면, 해당 줄을 건너 뛰지 않아야하기 때문에 실패합니다.
Talvi Watia

20

PHP-일관된 인수 순서

PHP는 배열이나 문자열에서 생각할 수있는 거의 모든 작업을 수행하기위한 많은 편리한 기능을 가지고 있습니다. 이러한 많은 작업은 a $needle와 a 를 모두 사용해야 $haystack하지만 서로 다른 함수는 순서가 다릅니다. 어느 함수가 어떤 인수를 요구하는지는 내가 얼마나 자주 그것들을 만나더라도 내 두뇌가 흡수하지 않는 사실 중 하나입니다!

기능을 가지고 와 in_array않는 strstr :

// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])

// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])

재미있게도, PHP는 $haystack, $needle배열 함수가 다른 방식으로 사용 되는 반면 모든 문자열 함수가 사용 되는 것처럼 보이기 때문에 이러한 순서와 내부적으로 일관성이있는 것처럼 보이지만 PHP를 처음 접하는 사람에게는 익숙해 질 수 있습니다. ExpressionEngine 에는 이 특정 기능에 대해 자세히 설명 하고 PHP 팀의 응답이 짧은 PHP 버그 목록에 대한 토론 이 있습니다.

helly@php.net
괜찮은 IDE를 사용하십시오.

2
이 순서를 기억하기 쉽게 $needle, $haystack이 말의 길을 생각 나게로 건초 더미에서 바늘 찾기 .
kiamlaluno

3
팁 : 배열 기능에서 바늘이 먼저옵니다. 문자열 함수에서는 haystack이 우선합니다.
GSto

17
나는 그 이름을 좋아한다 strstr. 너무 아름답게 의미가 없습니다.
구성자

5
PHP의 bugtracker에서 링크 된 항목을 읽으십시오. 진심으로? oO Imho 일관성은 모든 API에 유효한 문제이며 "괜찮은 IDE 사용"으로 응답하는 것은 올바른 응답이 아닙니다. 적어도 그것은 개발자들에 의해 덜 염증성이라고 말할 수 있습니다.
Baelnorn

2
솔직히, 이것에 대해 나를 미치게 만드는 것은 전혀 기능해서는 안된다는 것입니다! 단지 $ haystack-> find ($ needle) 방법이어야합니다. 거래 완료
riwalk

19

파이썬

self 인스턴스 메소드 정의의 매개 변수


클래스 메쏘드에서는 일반적으로 cls로 명명되며 self를 사용하면 컨벤션에 위배됩니다.

당신이 그것에 대해 생각하면 실제로 의미가 있습니다. 그것은 다른 언어에서 개인 메소드를 선언하는 것과 동일합니다. self 매개 변수는 파이썬에서 명시 적으로 다른 언어에서는 암시 적입니다. 암시 적으로 만들고 싶다면 메소드 선언 전에 @classmethod 데코레이터를 추가하십시오. docs.python.org/library/functions.html#classmethod를 참조하십시오 . 이것이 어떻게 작동하는지에 대한 세부 사항을 배우면 다른 언어로 암시 적으로 어떻게 수행되는지에 대한 통찰력을 얻을 수 있습니다.
Evan Plaice

4
나는 이유를 이해하고 거기에 남아있는 이유 neopythonic.blogspot.com/2008/10/...을 하지만, 난 여전히 그것을 좋아하지 않는다
고란 Peroš

@Evan Plaice : '자기 매개 변수는 파이썬에서 명시 적으로 다른 언어에서는 암시 적입니다.'스토리의 한 부분 일뿐입니다. 다른 부분은 파이썬이 매주 입력되는 것입니다. 함께하는 것은 끔찍합니다. 잊어 버리는 self것은 쉽게 일어나고 시간이 걸립니다.
maaartinus

@maaartinus 그런 다음 클래스 메소드 데코레이터를 인스턴스 메소드에 추가하십시오. '약한 유형'과는 아무런 관련이 없습니다. 정적 메소드 / 함수 ( 'self'매개 변수 없음)와 인스턴스 메소드 ( 'self'포함) 사이의 관계를 명확하게 만듭니다. 인스턴스 메소드는 참조를 제공하지 않으면 상위 클래스를 인식하지 못합니다. 다른 언어에서는 내가 설명한 독특한 특성이 구문 설탕 뒤에 숨겨져 있습니다. 내가 그것을 선택할 수 있다면 파이썬에서 먼저 OOP를 배우기 시작했을 것입니다.
Evan Plaice

18

자바

기간. 마침표. 이야기의 끝.

어디서 시작하나요? 오, 나는 어디서부터 시작해야하는지 안다 : 자바는 엄청나게 복잡하고 못 생기고 어리 석고 본질적으로 깨진 제네릭이다. 더 말할 필요가 있습니까? :( 좋아요, 다음 : type erasure .

그리고 비 결정적 리소스 관리가 있습니다. 켈프 풋처!

다음은 무엇입니까? 오 예 : Java의 어리석은 정규식 은 가장 짜증나고 소고기입니다. 백 슬래쉬가 충분하지 않아서 몇 번이나 호스를 쳤는지 셀 수 없습니다. 이것은이 밀레니엄에서 유니 코드 속성에 액세스 할 수없는 것보다 훨씬 나쁩니다. 구식 10 년이 지났습니다 !!! 완전히 쓸모없는. 휴지통

그런 다음 문자 클래스 바로 가기가 비 ASCII에서 작동하지 않는 버그가 있습니다. 왕의 고통! 그리고 사용하는 것도 고려하지 마십시오 \p{javaWhiteSpace}. 몇 가지 매우 일반적인 유니 코드 공백 코드 포인트로 올바른 작업을 수행하지 않습니다.

당신은 \p{javaJavaIdentifierStart}재산 이 있다는 것을 알고 있습니까? 그들은 무엇을 생각하고 있었습니까? 너무 똑똑해서 엿보는 똑똑한 엿보는 사람을 얻었습니다.

CANON_EQ 플래그를 사용해 보셨습니까? 당신은 그것이 실제로 무엇을 하지 않는지 알고 있습니까? 소위 "유니 코드 케이스"는 어떻습니까? 정상적인 케이스는 많이 작동하지 않습니다.

그런 다음 유지 관리 가능한 정규식을 작성하기가 어렵습니다. Java는 여전히 여러 줄 문자열을 작성하는 방법을 알지 못했기 때문에 다음과 같이 미친 것들을 작성하게됩니다.

    "(?= ^ [A-Z] [A-Za-z0-9\\-] + $)      \n"
  + "(?! ^ .*                             \n"
  + "    (?: ^     \\d+      $            \n"
  + "      | ^ [A-Z] - [A-Z] $            \n"
  + "      | Invitrogen                   \n"
  + "      | Clontech                     \n"
  + "      | L-L-X-X                      \n"
  + "      | Sarstedt                     \n"
  + "      | Roche                        \n"
  + "      | Beckman                      \n"
  + "      | Bayer                        \n"
  + "    )      # end alternatives        \n"
  + ")          # end negated lookahead   \n" 

그 줄 바꿈은 무엇입니까? 아, 그냥 자바 바보 야. 그들은 줄 끝까지가는 Java 주석 ( 바보! )이 아닌 Perl 주석을 사용했습니다 . 그래서 \n거기에 넣지 않으면 나머지 패턴을 잘라냅니다. Duh and double duh!

자바에서 정규 표현식을 사용하지 마십시오 : 당신은 물건을 부수기를 원할 것입니다. 나는 사람들이 이것을 참는 것을 믿을 수 없다. 일부는 그렇지 않습니다 .

그런 다음 인코딩으로 Java의 바보 말도 안되는 이야기를 시작할 수 있습니다. 첫째, Java의 charchars가 Unicode 인 경우에도 기본 플랫폼 인코딩은 항상 약간의 8 비트 인코딩이라는 사실이 있습니다. 그런 다음 인코딩 오류에 대해 예외를 발생시키지 않는 방법이 있습니다. 당신은 쓰레기가 보장됩니다. 아니면 어떻습니까?

OutputStreamWriter(OutputStream out) 
          Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs) 
          Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
          Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName) 
          Creates an OutputStreamWriter that uses the named charset.

차이점이 뭐야? 인코딩 오류가있는 경우 그 중 하나만 예외가 발생 한다는 것을 알고 있습니까? 나머지는 그냥 총구입니다.

그런 다음 캐릭터를 보유하기에 충분하지 않은 Java 문자의 관용구가 있습니다! 그들은 무엇을 생각하고 있습니까? 그래서 나는 그들을 charchars라고 부릅니다. 제대로 작동하려면 다음과 같은 코드를 작성해야합니다.

private static void say_physical(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

누가 그런 생각을합니까? 아무도 옆에.

몇 문자가 "\uD83D\uDCA9"있습니까? 하나 또는 둘? 계산 방법에 따라 다릅니다. 정규식 엔진은 물론 논리 문자를 처리하므로 패턴 ^.$이 성공하고 패턴 ^..$이 실패합니다. 이 광기가 여기에 설명되어 있습니다.

String { U+61, "\u0061", "a" }  =~ /^.$/ => matched.
String { U+61, "\u0061", "a" }  =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^..$/ => matched.

그 관용구는 당신이 완벽하게 합리적으로 글을 쓸 수 \u1F4A9없고, 물론 그렇게 할 수 없다는 경고를받지 않기 때문입니다. 그것은 단지 잘못된 일을합니다.

Stoooopid.

우리가 그 동안, 전체 \uXXXX표기법은 선천적으로 뇌사입니다. Java 전 처리기 ( 예, 당신은 저를 들었습니다 )는 Java보다 먼저 그것을 얻습니다. 따라서 Java가 그것을 "\u0022"보았을 때, 전처리 기가로 바뀌 었 """으므로 잃어 버릴 것입니다. 아, 잠깐 되지 는 정규식에 있다면! 그래서 당신은 "\\u0022"잘 사용할 수 있습니다 .

Riiiiiiiight!

Java에서 isatty(0)전화를 걸 방법이 없다는 것을 알고 있습니까? 당신은 그런 생각을 할 수 없습니다. 그것은 당신에게 좋지 않을 것입니다.

그리고 클래스 클래스 가증 전체가 있습니다.

또는 동일한 소스 파일에서 Java 소스 파일의 인코딩을 지정할 수있는 방법 이 없어서 손실되지 않습니까? 다시 한 번 나는 알고 싶어한다 : 그들이 무엇을 생각 했는지

광기를 멈춰라! 사람들이이 쓰레기를 참는 것을 믿을 수 없습니다. 완전한 농담입니다. 나는 터무니없는 자바 광기의 슬링과 화살을 겪는 것보다 월마트 인사를 원합니다. 그것은 모든 생겼습니다, 그들은뿐만 아니라 문제를 해결할 수 없습니다, 그들은 하지 않습니다 그것을 해결.

이것은 printf()기능 을 갖는 것이 불법이 된 언어에 자부심을 느낀 같은 포도 같은 사람들에 의해 . 저런, 그게 있는지, 실제 잘 작동하지만 그것을하지 않았다!?

깎아 지른듯한 감각. 암캐를 때리는 것은 너무 친절합니다. 어셈블러로 프로그래밍하고 싶다면 그렇게 할 것입니다. 이것은 구할 수있는 언어가 아닙니다. 황제는 옷이 없습니다.

우리는 그것을 싫어합니다. 우리는 그것을 영원히 싫어합니다 . 이 다이 죽게 다이를 !


하하, 좋은 하나, 나는 당신이 묘사 한 것처럼 닦지 않기 때문에 Java를 만지지 않습니다. \ uD83D에 관해서는 ... 음 나는 이것이 문자열이 UTF-16이 아니라 UTF-32라고 생각하는 더 좋은 방법이라고 가정합니다. UTF-16을 허용하면 정규 표현식이 올바른 작업을 수행합니다. 그것은 .length 전화입니다.
로마 스타 코프

4
-1. 정규 표현식 주석과 유니 코드 이스케이프를 제외하고 언급 한 것 중 하나가 구문 요소가 아닙니다.
Jörg W Mittag

3
@ Jörg, 구문을 원하십니까? 괜찮아요 : Java를 사용하면 식별자에 제어 문자 (ESC 및 NUL 포함)를 넣을 수 있습니다. 그들은 생각하고 있었다 ???
tchrist

4
@tchrist : 와우! Java 프로그램을 다시 작성하면 모든 변수의 이름에 다양한 수의 백 스페이스 문자 ( ^H)가 포함됩니다.
j_random_hacker

1
@tchrist, 기분이 나아 졌나요?

16

C 및 C ++의 함수 포인터 선언 구문 :

(int)(*f)(int, int);

이것은 fpointee가 두 개의을 가지고을 int반환 할 수 있는 함수 포인터를 선언 합니다 int.

다음과 같은 구문을 선호합니다.

f: (int, int) => int

당신은 함수 포인터를 선언하고 싶은 말은 g그의 pointee이 개 걸릴 수 int들과에서 함수 intintint, 그리고를 반환을 int.

C 또는 C ++ 표기법을 사용하면 다음과 같이 선언합니다.

(int)(*g)(int, int, int(int, int));

위에서 제안한 표기법으로 동일한 것을 다음과 같이 선언 할 수 있습니다.

g: (int, int, (int, int) => int) => int

후자는 훨씬 직관적 인 IMO입니다.


따로 : OOC라는 프로그래밍 언어는이 구문과 C 및 C ++의 다양한 구문 문제를 해결합니다. 홈페이지를 확인 하십시오 .


일부 "plain C"/ "C ++"는이를 지원하지 않거나 다른 구문으로 지원합니다. 프로그래밍 언어 기능이 지원되는시기를 나타내는 특수 구문입니다. 이것이 C #이 "대리인"구문을 추가 한 이유입니다.
umlcat

델리게이트는 객체를 저장하기 때문에 구문 설탕 일뿐만 아니라 (일반 함수 포인터보다 구문이 더 나쁜 C ++ 멤버 함수 포인터와 달리)
Tamás Szelei

14

자바의 장황.

즉 :

public static final int 

6
에 비해? (15 자)
TheLQ

7
const int예를 들면 다음과 같습니다 .
OscarRyz

11
"public static final int x = 4;" Haskell의 "x = 4"와 비교됩니다.
Jared Updike

24
그것은 상세하지 않습니다. 작성 시도 a+(b*c)/d*e+f/g^20사용하여 BigInteger자바. 이 언어는 왜 연산자 오버로딩을 허용하지 않습니까?
MAK

4
@Michael :이 비용으로 자신을 보호해야하는 프로그래머는 전혀 프로그래밍하지 않아도 자신을 보호하는 것이 가장 좋습니다 (다른 모든 사람의 고통을 줄일 수 있음) .D.
MAK

12

PHP의 \ we \ wouldnt \ fix \ our \ parser 네임 스페이스 구문

이 구문은 추악 할뿐만 아니라 새로운 개발자가 문자열의 네임 스페이스에 대해 생각해야 할 때 혼란을 야기합니다. PHP는 큰 따옴표로 묶인 문자열에서 백 슬래시를 이스케이프 시퀀스로 보간합니다. 작은 따옴표 \you\should\never\do\that로 묶은 문자열 대신 큰 따옴표로 묶은 문자열 과 같은 네임 스페이스를 나타내려고하면 줄 바꿈, 탭 및 재해가 발생합니다.


예, 누군가 더 나은 : : 방법을 생각했지만 PHP는 모든 연산자가 달라야한다고 주장합니다. 그래도 오용 문제가 무엇인지 궁금합니다.
Alan Pearce

동의하다. PHP는 네임 스페이스를 필요로하지만, 그 문법은 그것을
망쳐 놓는다

9

나는 중괄호가 if / while / for 문 다음에 선택 사항이 될 수 있다는 사실을 무시합니다.

특히 내가 같은 코드를 볼 때

if (...)
    for(...)
        ... One line of stuff ...

괄호를 넣고 끝내십시오.


6
흠 .. 이것은 다릅니다. 단순히 조건을 확인하고 오류 코드를 반환하는 (또는 예외를 발생시키는) "Abort Ifs"의 경우에는 중괄호가 표시되지 않습니다.
Billy ONeal

4
본인이 극단적 인 다단계 사례로 제한된다면 귀하의 진술은 너무 모호합니다. 간단한 단일 명령문 if 및 루프를 위해 짧은 형식을 갖는 기능에는 큰 유용성이 있습니다.
Timwi

2
내 규칙 : 문장에 여러 개의 하위 문장이 필요한 경우 또는 그러한 문장포함되어있는 경우에만 중괄호로 묶어야합니다. 따라서 적절한 들여 쓰기로 물론 for (...) while (...) if (...) { x(); y(); }더 잘 작성됩니다 for (...) { while (...) { if (...) { x(); y(); } } }.
Jon Purdy

6
나는 오히려 정반대입니다. 나는 그들이 완전히 불필요 할 때 교정기를 착용해야한다고 주장하는 사람들을 경멸합니다. 프로그래밍하는 법을 배우십시오.
Jerry Coffin

3
단일 if 문에서도 대괄호가 정말 좋습니다. 그것은 프로그램의 흐름을 더 잘 따르게합니다.
Ricardo Santos

9

VBScript에는 논리 연산자가 없습니다

거의 모든 현명한 언어와 달리 VBScript는 논리 연산자 대신 비트 연산자를 사용합니다. 이것이 실제로 무엇을 의미합니까? 음, 같은 에릭 Lippert의 지적 :

If Blah = True Then Print "True!" Else Print "False!"

If Blah Then Print "True!" Else Print "False!"

VBScript에서 동일하지 않습니다!

더 나쁜,하지만, 다음과 같은 문장이 때문에 이렇게 VBScript를에는 단락 회로 평가이 수단이 없음을 충돌 프로그램을하면 Blah됩니다Nothing

If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...

맞습니다. VBScript는 첫 번째 것이 거짓 인 경우에도 AND 비교의 부분을 모두 평가 합니다 ! 그 싱크대에 들어가게 해


3
내부에서 버그를 찾고 If x Then ... If Not x Then ... End If ... End Ifx가 2라는 것을 알기 전까지는 실제로 VB / VBScript로 프로그래밍되지 않았습니다.
구성자

7

편집 : 의견의 토론에 이어 나는 더 나은 설명을 위해이 답변을 업데이트하기로 결정했습니다.

함수 포인터가 C에서 보이는 방식이 정말 싫습니다. 일반적으로 모든 변수 선언은 튜플처럼 보입니다. type varname; 반면에 함수 포인터 선언은 함수 이름 앞에 *를 사용하여 함수를 선언하는 것처럼 보입니다. 이것을 포인터 유형의 설명으로 받아 들일 수는 있지만 C에서는 해당 유형의 변수의 유형과 이름을 모두 선언합니다. 유형 선언이 변수 선언과 다르기 때문에 이것은 나에게 일관성이 없습니다. struct myStruct{int X; int Y;}유형 만 정의하고라는 변수를 정의하지 않습니다 myStruct. 마찬가지로 유형 선언과 변수 선언이 함수 포인터에서 하나의 원자 명령문 으로 그룹화 될 이유가 없습니다 .type varname; 구조와 .

누군가는 그것이 어떤 나선 규칙과 일치한다고 지적했으며, 그럴 수도 있지만 좋은 구문의 표시는 자기 설명이 필요하고 내부 논리가 분명하다는 것입니다. 어떤 나선 규칙도 분명하지 않습니다.


1
그것은 나머지 언어와 일치하므로 아마도 C 선언자의 구문에 대한 불만이 있습니까? Go 에서 사용되는 구문을 선호 합니까?
finnw

어떤 방식으로 일관성이 있습니까? 일반적으로 간다 : type varname; 그리고 구조체와 같은 새로운 복합 타입을 만들 때, 먼저 typedef와 함께 선언이 나온 다음 해당 타입의 변수를 만듭니다. 함수 포인터를 선언하면 int (* foo) (int arg1, int arg2)이며, 함수에 전달 된 인수의 유형으로 사용됩니다. void newFoo (int (* foo) (int arg1, int art2 )) .... 그리고 변수로 : foo = a_compatible_func; 먼저 함수 선언과 다음에 var 선언이 더 일관성이 있다고 생각합니다. typedef int (* foo) (int, int) MyFoo; MyFoo myfoo;
EpsilonVector

그래서 당신이 typedef있습니다.
zneak

4
@ EpsionVector : 함수 포인터 구문이 불쾌하다는 데 동의하는 경향이 있지만 쉽게 읽을 수있는 간단한 규칙이 있습니다. 시계 방향의 나선 규칙 (아마 보셨나요
greyfade

1
EpsilonVector : 변수 이름 이외의 것을 선언하기 위해 포인터 변수 선언 에서 무엇을 기대하는지 잘 모르겠습니다 .

6

VBScript의 세미콜론 또는 그 부족

나는 하루 종일 각 줄 끝에 세미콜론이 필요한 언어로 하루 종일 일합니다. VBScript에서 줄 끝에 하나를 추가하면 코드가 더 이상 실행되지 않습니다.


4
나는 세미콜론을 좋아하기 때문에가 아니라 VB가 줄 바꿈 을 너무 불편하게하여 실제로 긴 줄 을 권장하는 방식을 싫어 하기 때문에 이것을 투표합니다 .
Shog9

6

인 / 아웃 인수. 나는 논쟁에서 모두를 위해 (내가 좋은 일이다), 논쟁도 괜찮지 만,이 두 가지 상태를 전달 해야하는 논쟁은 나를 화나게한다.

여기서 내가 목표로하는 것은 매개 변수에서 입력을 가져온 다음 해당 입력을 일부 출력으로 덮어 쓰는 함수입니다. 객체를 참조로 전달하여 업데이트해도됩니다. 그러나 대부분 기본 유형의 경우 객체를 가져 와서 사용하고 완전히 변경하면 나에게 맞지 않습니다. 인아웃을 통해 인수 의 의미 를 변경해서는 안됩니다 .


어떤 언어를 염두에두고 있습니까? C # 인 경우 C ++과 달리 항상 명시 적이기 때문에 성가신 것에 동의하지 않습니다. 또한 인수를 입 / 출력으로 선언 해야하는 주류 언어를 알지 못합니다.
finnw

@finnw 나는 당신 논쟁에 in대해 말해야 할 언어를 본 적이 없다 in. 나는 단지 그들에 대해 이야기하고있다. 또한 내 의견 으로는 입 / 출력 논쟁을 변명 할 수 없으며 그것을 명시 적으로 만드는 것이 고통을 완화 시키지는 않습니다. 함수에 도움이되는 값으로 로컬 변수를 초기화 할 이유가 없어야하며, 동일한 변수를 가지면 함수가 거기에 놓기로 결정한 모든 것을 갑자기 포함 할 수 있습니다. 이 두 가지가 분명해야합니다. 항상.
zneak

미안하지만 명확하지 않았습니다. "모든 인수가 암시 적으로 + out 인 언어를 모릅니다"라고 말하려고했습니다. 즉, 해당 기능을 사용해야하는 것은 아니지만 합법적 인 사용 사례가 있습니다 (예 : struct새 값이 값에 의존 하는 위치 업데이트). 같은 분야의 다른 분야 struct.)
finnw

@finnw class함수에 의해 수정 된 참조로 전달 된 객체 (예 : C # 의 객체 인스턴스 )는 괜찮습니다. 상수가 아닌 구조체를 싫어한다는 것 외에도 키워드 struct와 함께 ref키워드를 전달 하여 업데이트하는 것도 좋습니다. 내가 정말로 싫어하는 것은 입력이 출력 으로 덮어 쓰여질 때 입니다. 제가 생각할 수있는 가장 좋은 예는 버클리 소켓의 accept기능입니다. socklen_t*입력시 struct sockaddr*전달한 크기를 포함해야하는 인수가 필요합니다 . 출력시, 작성된 바이트 수를 포함합니다. 이건 범죄 야
zneak

나는 나쁘다 (IIRC는 일부 Win32 I / O 함수가 동일하게 작동하지만) 기능을 잘못 사용하고 있습니다 (함수 호출은 전달 된 변수의 의미가 아니라 값만 변경합니다). 그 자체는 나쁘다.
finnw

6

C 및 C ++의 배열 선언

일반적으로 변수 선언은 형식 type variable_name입니다. 이러한 선언을 왼쪽에서 오른쪽으로 쉽게 읽을 수 있습니다. 그러나 int foo[size]처음 foo에는 int로 선언하는 것처럼 보입니다. 그런 다음 더 자세히 읽고 foo의 "정수 배열"유형을 봅니다. int[size] foo훨씬 더 잘 읽습니다.

그리고 프로그래머가 비슷한 이유로 포인터를 선언하면 싫어요 int *foo. 내가 알지 못했던 어떤 이유로, 그것이 작성 되는 일반적인 방법입니다.


1
포인터 선언 : ' '는 유형이 아닌 변수 이름에 바인딩int* a, b; 되므로 그렇게 작성 됩니다. 그래서 *하지 않습니다 선언 ab포인터로; 단지 a입니다. 따라서 그것을 작성하는 것이 좋습니다 int *a, b;(또는 두 개의 선언으로 작성하는 것이 좋습니다).
Steve Melnikoff

좋은 지적. 너무 나쁘면 *유형에 바인딩되지 않습니다.
Jacob

2
그리고 이것은 함수 포인터에 대해 아무 말도하지 않는 것입니다 ... void(int) *f;? Nope :void (*f)(int);
자기주의 사항-이름을 생각하십시오.

현대 C ++에서는 포인터와 배열이 거의 필요하지 않습니다.
fredoverflow

2
@ Steve Melnikoff :이 답변을 +1했지만 int* a, b;언급 한 문제가 훨씬 더 심각 하다고 생각합니다 .
j_random_hacker

5

Java에서 중복 매개 변수화 :

HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();

컴파일러가 생각할 foo 수있는 다른 유형 매개 변수는 무엇입니까 ?


4
Java (제한적) 유형 유추를 알고 있기를 바랍니다. HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
finnw

1
Java 7 :HashMap<String,HashMap<String,String>> foo = new HashMap<>();
Bart van Heukelom

5
글쎄, 그것은 원하는 모든 유형을 가질 수 있고, 그 유형은 어쨌든 지워진다 ...
구성자

형식 유추가 부족합니까?
missingfaktor

What other type parameterization does the compiler think foo could have?-어떤 이유로 든 마치 제정신 유형과 매개 변수화 된 유형을 혼합 한 것처럼 원시 유형입니다.
maaartinus

5

사람들이 이미 =vs ==에 대해 불평 했으므로 훨씬 더 나쁜 대안을 지적하겠습니다. PL / I는 모두를 가지고 :==, 하지만 뭔가 "분명히"할당이 때, 당신이 사용하여 도망 할 것이다 =그것을 할 수 있습니다. 사용:= 하면 컴파일러가이를 비교로 해석하는 상황에서 무언가를 강제로 할당 할 수 있습니다.

불행하게도, 컴파일러는 항상 예상했던대로 일을 결정하지는 않았습니다. 하나의 명백한 예를 고려하십시오.

A = B = 0;

이제 대부분의 "일반적인"언어에 익숙한 대부분의 사람들에게이 의미는 매우 분명합니다. A와 B 모두에 0을 할당하십시오. PL / I는 조금 다릅니다. 언어의 (미친) 디자이너에게만 알려진 이유로, 첫 번째 =는 과제로 해석되지만 두 번째는 과제로 해석됩니다.= 는 비교로 해석됩니다. 따라서 이것은 B를 0과 비교 한 다음 그 비교 결과를 A에 할당합니다 ( "거짓"은 1이고 "참"인 C 스타일 규칙을 따릅니다).

따라서 B가 0이면 A가 1이됩니다. 그렇지 않으면 A가 0이됩니다. 즉, A와 B에 같은 값을 할당하지 않고 실제로 A 가질 .

결론 : C / C ++ / PHP 스타일이 처음에는 고통 스러운 것처럼 보이지만 대안은 훨씬 더 나쁩니다 1 .

1 기술적으로는 또 다른 대안이 있습니다. 파스칼 스타일 (Pascal style). =항상 비교와 할당은 항상 필요합니다 :=. 그것을 잠시 사용한 후에, 할당이 두 가지를 명확하게하기 위해 여분의 "물건"을 필요로 할 경우, 할당을 깨끗하고 간단하게 유지해야한다는 점보다 할당이 훨씬 일반적이라는 것이 분명합니다 (적어도 나에게). 비교에 대한 추가 "그런 지"가 필요하며 그 반대도 마찬가지입니다.


1
나는 ==평등과 :=과제 를 위해 사용할 것을 제안했다 . 이렇게하면 타이핑을 더 많이 할 수 있지만 외로움 =을 피하면 버그를 피할 수 있습니다.
maaartinus

@maartinus : 적어도 나에게, 그것은 절대 최악의 가능성처럼 들리지만, 그런 삶이다 ...
Jerry Coffin

3

  1. 펄이 글을 쓰도록하겠습니다 if($x < 10) do_something();. 현재로서는 do_something() if($x < 10);또는로 작성해야합니다 if($x < 10) { do_something(); }.

9
do_something() if ($x < 10);그렇게 나쁘지 않습니다.
zneak

if(..) ...모든 표현식을 오른쪽에 표시 할 수 있기 때문에 부팅하는 것보다 훨씬 깨끗하지 않으며 대부분의 경우 부팅 보다 훨씬 깨끗 합니다. 그러나 정말로 말하고 싶은 시간 if($x < 10) do_something();이 있으며 펄이 나를 허락하지 않는 것은 불행합니다.
Gaurav

7
당신이 글을 쓰고 if ($x<10) do_something(); and_call_me(); 왜 전화를받지 않는지 궁금 할 때까지는 불행 합니다. C와 가족이 이러한 유형의 오류를 방지하기 위해 중괄호를 요구하기를 바랍니다.
AShelly

2
@AShelly : 또는 실제로 항상 전화를받는 이유.
zneak

1
@zneak elses 제외 . ( EXPR1 if COND else EXPR2파이썬이 갖고있는 것처럼 바란다 )
Ming-Tang

3

reinterpret_cast<unsigned long>C ++에서. 이 작업은 외부 API를 처리하고 숫자의 정확성을 보장하는 데 유용합니다. 왜 입력하기가 너무 어려워 보입니까?


17
필요하지 않은 코드를 작성하려고 노력해야한다는 사실을 기억하지 못합니다. :)
greyfade

나에게 그것은 좋은 이론적 컴퓨터 과학적 논증이지만, 내 경험상 피하는 것이 너무 유용합니다 (그러나 내 경험의 대부분은 평범한 오래된 C이므로 편견이있을 수 있습니다).
AShelly

5
실제로 이론적 인 CS 주장은 아닙니다. reinterpret_castC ++에서 a 를 사용하는 것은 매우 강력한 코드 냄새입니다. 99 %의 시간, 당신이 그것을 사용하려고 할 때, 당신은 할 필요가 없습니다-당신은 아마 뭔가 잘못했을 것입니다. 시간의 다른 1 %는 C와 인터페이스하고 reinterpret_cast있습니다. 그렇지 않으면 불가능한 일을하기 위해 형식 시스템이 작동하지 않습니다. 그것은 일반적으로 나쁜 것입니다.
greyfade

3

배열을 반복 할 때 JavaScript 의 for ... in 구문과 PHP 의 foreach 구문입니다. 둘 다 올바른 코드보다 버그를 작성하기가 더 쉽습니다.


3
와우, 그건 헛소리 야. “올바른 코드보다”. 저리가
Jonathan Sterling

안전하게 사용하기 위해 추가 코드를 작성해야하는 경우 내 책에서 잘못 사용하는 것이 더 쉽습니다. for ... in은 프로토 타입에서 객체를 반복하지 않도록 추가 검사가 필요하며 foreach는 나중에 참조를 정리하거나 배열의 마지막 값을 덮어 쓸 위험이 있습니다.
Joeri Sebrechts

참조 변경 (& 연산자)이있는 foreach는 유명한 버그입니다.
umlcat

1
혼란 스럽습니다. JavaScript의 "for..in"구문이 손상되었다는 것이 일반적인 지식이라고 생각했습니다. 왜 이것이 불쾌합니까?
lvilnis 2012 년

2

C / C ++에서 배열의 포인터 또는 포인터의 포인터 나는 아직도 이것에 대해 혼란스러워합니다.


3
유형을 거꾸로 읽으십시오. int[]*정수 int*[]배열에 대한 포인터이고 정수에 대한 포인터의 배열입니다. consts 와도 잘 작동합니다 : int* const정수에 대한 상수 포인터입니다.const int*int const*상수 정수에 대한 포인터 (또는 정수 상수로).
zneak

@zneak : "오른쪽에서 왼쪽으로"가 작동하지 않습니다. 언급 된 "시계 방향 나선형"/ "내부" 규칙을 참조하십시오.

또는 typedef를 사용하면 혼란이 없습니다.
Billy ONeal

현대 C ++에서는 포인터와 배열이 거의 필요하지 않습니다.
fredoverflow

4
@tchrist : 사실이 아닙니다. 10 int의 배열에 대한 포인터 int (*p)[10];임을 선언 p합니다. 경우 sizeof (int) == 4다음 p++진출하게됩니다 p(40)에 의해
j_random_hacker


1

Javascript / Java 등, 비교와 동일합니다. 예 : if (a == 1)

if (a = 1)을 몇 번이나 쓰나요?

인간으로서 나는 그것을 완벽하게 읽습니다. 그러나 대담한 통역사 / 컴파일러는 "이봐, 나는 1을 a에 할당하고 a가 1과 같은지 확인하고, 그렇다고 믿는가?"

나를 벽으로 몰아 넣는다.

if (a == 1) 가독성이 떨어지고 인터프리터 / 컴파일러는 내가 무슨 뜻인지 알아야합니다. 다른 많은 언어 (VB)는 수백 년 동안이 언어를 성공적으로 개발해 왔습니다.


무슨 if (a = true)뜻입니까?
Tom Hawtin-tackline

2
할당은 값을 반환해서는 안됩니다. 때로는 유용하지만 대부분의 경우 목에 통증이 있습니다.
구성자

Javascript에서 JSLint는 그 중 하나를 잡을 것입니다.
Zachary K

문제는 조건에서 할당하는 것이 유용 할 수 있다는 것입니다. <tt> while (element = list-> next ()) </ tt>가 읽기 쉽다는 것을 알았습니다. 따라서 제거했는지 확실하지 않습니다.
잉카

3
@Tom : 부울을 이해하지 못한다는 것을 의미합니다. 당신이 의미하는 경우 if (a == true), 그냥 작성하십시오 if (a). 을 의미 a = true하면 if명령문이 중복됩니다.
dan04


0

structPointer->memberC / C ++에서. 다른 사람의 코드를 읽는 데 도움이 될 수 있지만 마음에 들지 않습니다. 하나 대신 두 문자 ... 공간 낭비!


2
불행히도, .포인터가 아닌 객체의 멤버에 적용 되는와 구별되어야 합니다. 모호한 구문이 잘못되었습니다.
greyfade

2
@ greyfade : p! 컴파일러는 할 수 없기 때문에 아마도 당신은 포인터 - 투 - 구조체 유형을 사용할 때 말해 암시 적으로 역 참조를 적용하기 위해 형식 시스템 규칙을 사용합니다. 아니, 그거 미친 이야기 야! (그러나 오류가 발생해도 여전히 오류 메시지가 표시 될 수 있습니다.) 구문에 대해 모호한 것은 없습니다. 평소와 같이 C는 단지 브레인 데드 혼란입니다. 델파이는 암시적인 역 참조를 잘한다. 만약 당신이 실제로 레코드-포인터를 필요로하는 어두운 구석에서 작업한다면 파서를 혼동하지 않고 확실히 할 수있다.
Mason Wheeler

5
@Mason는 :의 경우는 좋아하는 것에 대해 shared_ptr, 어디에 ->포함 된 유형에 액세스하고 .의 속성에 접근 shared_ptr자체를? 죄송하지만 여기에 완전히 동의하지 않습니다.
Billy ONeal

2
더 나빠질 수 있습니다. 당신이 사용해야하는 PHP, 할 수 ->의 액세스 회원에게 아무것도 .
카슨 마이어스

1
@maaartinus : 명확하지 않은 순서의 연산에 크게 의존하는 코드는 내가 작성할 코드가 아닙니다.
Billy ONeal

0

대괄호 안에있는 스칼라 멀티 라인 코드

예를 들어 :

class Foo(
         val bar: String,
         val baz: Int,
         val bing: String,
         val bong: Boolean
 ) extends Model {
   // body here
 }

당신이 실제로 얻는 것은 훌륭합니다. 생성자와 getter 및 setter를 생성합니다. 그러나 그것은 추악하고 코드를 들여 쓰는 방법에 대한 모든 정신적 모델을 깨뜨리고 기본적으로 한쪽에는 Java가 있고 다른쪽에는 Lisp가있는 기괴한 샌드위치에있는 것처럼 느끼게합니다. (오, 잠깐만 ... 스칼라의 요점입니다.)


혼란 스러워요-괄호 안의 val bar부분 또는 중괄호 안의 부분 (다음 부분 extends Model)을 의미합니까? (해당 코드에는 대괄호가 없습니다)
Billy ONeal

3
괄호 안의 부분. 나는 영어입니다. 우리는 그것들을 대괄호라고 부릅니다. 그 상황에서는 괄호 역할을하지 않기 때문입니다.
Tom Morris

2
들여 쓰기 경우이 방법을 모든 나쁜 보이지 않습니다 pastebin.com/h9qC8XGg
missingfaktor

이러한 생성자 매개 변수 목록을 가로로 작성하는 것이 더 읽기 쉽습니다. 특히 매개 변수가 몇 개 밖에 없을 때 더욱 그렇습니다.
MJP

나에게 방법처럼 보인다. 시뮬 라처럼. 좋은 옛날 학교.
Tom Hawtin-tackline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.