문제

수학적 증거를 작성할 때 한 가지 목표는 증거를 계속 압축하는 것입니다. 증거는 더 우아하지만 반드시 읽기 쉬운 것은 아닙니다. 압축은 불필요한 캐릭터와 구동성을 제거하면서 더 나은 이해로 해석됩니다.

나는 종종 개발자들이 당신이 당신의 코드 발을 가능한 작게 만들어야한다고 말하는 것을 들었습니다. 이것은 읽을 수없는 코드를 매우 빠르게 생성 할 수 있습니다. 수학에서는 운동이 순전히 학문적이기 때문에 그런 문제가 아닙니다. 그러나 시간이 돈 인 생산 코드에서 사람들이 매우 간결한 코드가 무엇을하고 있는지 알아 내려고하는 것은 그다지 의미가없는 것 같습니다. 조금 더 장황한 코드의 경우 가독성과 저축을 얻습니다.

소프트웨어 코드 압축을 중지합니까?

도움이 되었습니까?

해결책

나는 프로그래머가 이해할 수있는 문장처럼 내 프로그램 진술을 읽는 수준의 구두 수준에 도달하려고 노력합니다. 이것은 내 코드가 모두 짧은 이야기가되도록 내 코드를 크게 리팩토링하는 것을 의미하므로 각 조치는 별도의 방법으로 설명됩니다 (더 많은 수준은 다른 클래스에 해당 할 수 있습니다).

즉, 문자 수가 줄어들 수 있기 때문에 문자 수를 줄이지 않을 것입니다. 그것이 코드 골프 대회의 것입니다.

다른 팁

내 규칙은 당신이 무슨 뜻인지 말하십시오. 사람들이 잘못되는 것을 보는 일반적인 방법 중 하나는 "강도 감소"입니다. 기본적으로 그들은 생각하는 개념을 단계를 건너 뛰는 것으로 보이는 개념을 대체합니다. 불행히도, 그들은 코드에서 개념을 남겨두고 읽기가 더 어려워지고 있습니다.

예를 들어, 변경

for (int i = 0; i < n; i++)
    foo[i] = ...

에게

int * p = foo, q = foo+n;
while ( *p++ = ... < q );

단계를 절약하는 것처럼 보이는 강도 감소의 예이지만 Foo가 배열이라는 사실을 제외하고 읽기가 더 어렵습니다.

또 다른 일반적인 것은 열거 대신 bool을 사용하는 것입니다.

enum {
    MouseDown,
    MouseUp
};

이게

bool IsMouseDown;

이것이 상태 기계라는 사실을 제외하고 코드를 유지하기가 더 어려워집니다.

따라서 내 경험의 규칙은 구현에서 표현하려는 개념보다 낮은 수준으로 파지 않을 것입니다.

중복성을보고 제거하거나 영리하게 코드를 작게 만들 수 있습니다. 후자가 아니라 전자를하십시오.

다음은 Steve McConnell의 좋은 기사입니다 - 모범 사례 http://www.stevemcconnell.com/ieeesoftware/bp06.htm

짧고 간결한 것은 잘 작성된 코드의 두 가지 결과라고 생각합니다. 코드를 좋게 만드는 많은 측면이 있으며, 잘 쓰여진 코드의 많은 결과는 두 가지가 다르다는 것을 인식합니다. 당신은 작은 발 인쇄를 계획하지 않고, 간결한 함수를 계획하고 하나의 일을 매우 잘 수행 할 계획입니다. 이것은 작은 발자국으로 이어질 수 있지만 그렇지 않을 수도 있습니다. 다음은 코드를 작성할 때 초점을 맞춘 것에 대한 짧은 목록입니다.

  • 단일 초점 기능 - 함수는 한 가지만 수행해야합니다. 간단한 전달, 멀티 주요 기능은 버그가 많고 쉽게 재사용 할 수 없습니다.
  • 느슨하게 결합 - 하나의 기능에서 글로벌 데이터로 연락하지 않고 다른 기능에 크게 의존하지 않습니다.
  • 정확한 이름 지정 - 의미있는 정확한 변수 이름을 사용하면 암호 이름이 바로
  • 코드를 간단하고 복잡하지 않음 - 과도한 언어별로 사용하지 마십시오. 다른 기술 과우, 다른 사람을 감동시키는 데 좋고 쉽게 이해하고 유지하기가 어렵습니다. 너나가
  • 균등하게 의견 - 많은 의견은 무시되고 구식이 없을 것입니다.
  • 서식 - 코드가 어떻게 보이는지 자부심을 가지고 올바르게 들여 쓰기 코드가 도움이됩니다.
  • 코드 유지 보수 담당자의 마음과 함께 일 - 쓰고있는 코드를 유지하는 것이 어떤 것인지 생각하십시오.
  • 두려워하거나 Refactor를 게으르십시오 - 처음에는 완벽한 것이 없습니다. 자신의 혼란을 정리하십시오.

균형을 찾는 한 가지 방법은 가독성 그리고 간결하지 않습니다. 프로그래머는 지속적으로 코드를 시각적으로 스캔하여 수행중인 작업을 확인하므로 코드가 가능한 한 잘 흐르도록해야합니다.

프로그래머가 코드를 스캔하고 이해하기 어려운 섹션을 쳤거나 시각적으로 구문 분석하고 이해하기 위해 약간의 노력이 필요한 경우 나쁜 일입니다. 잘 이해되는 구조물을 사용하는 것이 중요하며, 모호한 곳에서 멀리 떨어져 있지 않고 필요한 경우가 아니라면 드물게 사용됩니다.

인간은 컴파일러가 아닙니다. 컴파일러는 물건을 먹고 계속 움직일 수 있습니다. 모호한 코드는 명확하게 이해되는 코드만큼 빨리 인간이 정신적으로 소비되지 않습니다.

때때로 복잡한 알고리즘에서 읽을 수있는 코드를 생성하는 것은 매우 어렵지만 대부분의 경우 인간의 가독성은 우리가 찾아야하는 것입니다. 나는 코드의 길이가 실제로 명확성의 척도라고 생각하지 않습니다. 때로는 더 장황한 방법이 간결한 방법보다 읽기 쉬우므로 간결한 방법이 긴 방법보다 더 읽기 쉽기 때문입니다.

또한 의견은 보충해야하며 코드를 설명해서는 안됩니다. 코드는 자체를 설명해야합니다. 무엇을 수행했는지 분명하지 않기 때문에 줄에 댓글을 달아야한다면, 그것은 나쁘다. 대부분의 숙련 된 프로그래머가 코드 자체를 읽는 것보다 영어 설명을 읽는 데 시간이 더 걸립니다. 책 코드 가이 집을 망치게한다고 생각합니다.

객체 이름이가는 한, 이것에 대한 생각은 새로운 프로그래밍 언어의 도입으로 진화를 거쳤습니다.

C로 시작하여 "Curly Brace"언어를 취하면 Brevity는 재치의 영혼으로 간주되었습니다. 예를 들어 "LV"라는 대출 가치를 보유 할 변수가 있습니다. 아이디어는 많은 코드를 입력했다는 것이 었으므로 키 스트로크를 최소로 유지하십시오.

그런 다음 Microsoft-Sanctioned "Hungarian Exation"이 나왔는데, 여기서 변수 이름의 첫 글자는 기본 유형을 나타내는 것을 의미했습니다. 대출 가치가 플로트 변수로 표시되었음을 나타 내기 위해 "FLV"또는 그와 같은 일부를 사용할 수 있습니다.

Java와 C#을 사용하면 패러다임이 명확성이되었습니다. 대출 가치 변수의 좋은 이름은 "대출 값"입니다. 나는 이것의 이유 중 일부가 대부분의 현대 편집자의 명령-완성 기능이라고 생각합니다. 더 이상 전체 이름을 입력 할 필요는 없으므로 설명에 필요한만큼 많은 캐릭터를 사용할 수도 있습니다.

이것은 좋은 추세입니다. 코드는 이해할 수 있어야합니다. 의견은 종종 나중에 생각하면 종종 추가됩니다. 또한 코드가 업데이트되면 업데이트되지 않으므로 구식이됩니다. 설명 적, 잘 선택된, 가변 이름은 다른 사람들이 당신이 무엇에 대해 무엇에 대해 코딩하고 있는지 알려주는 첫 번째, 가장 좋은 방법이며 가장 쉬운 방법입니다.

나는 컴퓨터 과학 교수가 있었다. "엔지니어로서 우리는 끊임없이 존재하지 않은 것들을 만들고있다. 의미있게."

짧은 달콤한 소스 코드와 성능 사이에는 균형이 필요합니다. 그것이 좋은 소스이고 가장 빠르고, 좋았다면, 좋은 소스를 위해서는 강아지처럼 달려 가면 나쁘다.

코드 자체가 잘 읽을 때까지 리팩터를 리팩터링하려고 노력하십시오. 프로세스에서 자신의 실수를 알게 될 것입니다. 코드는 "다음 사람"을 위해 쉽게 맥주하기가 더 쉬울 것이며, 이미 표현한 내용의 의견을 유지하고 나중에 변경하는 것을 잊어 버리지 않을 것입니다. 암호.

그것이 실패 할 때 ... 물론, 나에게 의견을 남겨주세요.

그리고 나에게 "무엇"에서 "코드가 무엇을위한 것인지)를 말하지 마십시오."왜 "를 말해주십시오.

Long/Rambling과는 반대로? 확신하는!

그러나 그것은 너무 짧고 간결하여 이해하기 어렵다는 점에 도달하면 너무 멀리 갔다.

예. 언제나.

마른: 자신을 반복하지 마십시오. 그것은 당신에게 간결하고 안전한 코드를 줄 것입니다. 동일한 코드를 여러 번 작성하는 것은 유지하기가 어렵다는 좋은 방법입니다.

그렇다고해서 코드 블록의 함수를 원격으로 똑같이 보이게해야한다는 의미는 아닙니다.

예를 들어 매우 일반적인 오류 (공포?)는 코드를 고려하는 것입니다. 거의 동일한 점, API 기능에 플래그를 추가하여 발생의 차이를 처리합니다. 이것은 처음에는 무심하게 보일 수 있지만, 코드 흐름을 이해하기 어려운 코드 흐름을 생성하고 버그가 발생하며 심지어 리팩터가 더 어렵습니다.

일반적인 리팩토링 규칙 (코드 냄새에 대해 찾음)을 따르는 경우 많은 코드 냄새가 중복성을 감지하는 데있어 코드가 부작용으로 점점 더 간결하게됩니다.

반면에, 당신이 의미가 많은 가이드 라인을 따르지 않고 가능한 한 짧게 코드를 만들려고한다면, 코드를 줄이는 방법을 더 이상 보지 않기 때문에 어느 시점에서 중지해야합니다.

첫 번째 단계가 모든 쓸모없는 공백을 제거하고 있다고 상상해보십시오. 대부분의 프로그래밍 언어에서 해당 단계 코드가 읽기가 어려워지면 다른 가능한 향상을 찾을 수있는 기회는 많지 않습니다.

위의 예는 매우 풍자적이지만 현명한 가이드 라인을 따르지 않고 크기를 최적화하려고 할 때 얻는 것과 그리 멀지 않습니다.

Glib 인 코드와 꽃이 피는 코드를 구별하기 위해 그릴 수있는 정확한 선은 없습니다. 최선의 판단을 사용하십시오. 다른 사람들이 코드를보고 그들이 얼마나 쉽게 이해할 수 있는지 보도록하십시오. 그러나 정확성은 1 위 목표입니다.

소형 코드 발자국의 필요성은 어셈블리 언어 시절과 첫 번째 약간 높은 언어의 후퇴입니다. 실제와 긴급한 필요가있는 작은 코드 발자국이 있습니다. 그러나 요즘에는 그다지 필요한 것은 아닙니다.

즉, 나는 장황 코드를 싫어합니다. 내가 일하는 곳에서, 우리는 추가 문법이나 단어없이 자연 언어처럼 가능한 한 읽는 코드를 작성합니다. 그리고 우리는 매우 일반적인 약어가 아니라면 아무것도 축약하지 않습니다.

Company.get_by_name("ABC") 
makeHeaderTable()

우리가가는 것처럼 간결합니다.

일반적으로 나는 분명하고 작업하기 쉬운 일을합니다. Concision/Shless가 저에게 도움이된다면, 더 나은 것이 더 좋습니다. 종종 짧은 대답이 가장 분명하므로 짧은 부산물은 분명한 부산물입니다.

최적화를 중지 할시기를 결정하는 내 마음에는 몇 가지가 있습니다.

  • 최적화를 수행하는 데 시간을 소비 할 가치가 있습니다. 사람들이 몇 주를 보내고 아무것도 찾지 못한다면, 그 자원을 더 잘 사용하는 것이 있습니까?

  • 최적화 우선 순위의 순서는 무엇입니까? 코드와 관련하여 신경을 쓸 수있는 몇 가지 요인이 있습니다 : 실행 시간, 실행 공간 (실행 및 컴파일 된 코드), 확장 성, 안정성, 구현 된 기능 수 등이 거래되는 것입니다. 시간과 공간에서, 그러나 일부 코드는 어디로 갈 수 있습니까? 예를 들어 미들웨어는 임시 SQL 명령을 실행할 수 있습니까?

요점은 절도 가장 좋은 솔루션은 가질 것입니다.

코드 최적화는 코딩 스타일과 거의 관련이 없습니다. 파일에 처음보다 X 공간이나 새 행이 포함되어 있다는 사실은 적어도 실행 단계에서 더 좋거나 빠르게 만들어지지 않습니다. 컴파일러가 무시하는 흰색 문자로 코드를 포맷합니다. 코드는 다른 프로그래머와 자신에게 읽을 수 없기 때문에 코드를 악화시킵니다.

테스트 조건, 제어 흐름, 가정, 오류 처리 또는 전체 프로그래밍 인터페이스와 같은 논리 구조에서 코드가 짧고 깨끗해지는 것이 훨씬 더 중요합니다. 물론 여기에도 스마트하고 유용한 주석 + 문서를 포함시킬 것입니다.

간결한 코드와 성능 사이에 반드시 상관 관계가있는 것은 아닙니다. 이것은 신화입니다. C/C ++와 같은 성숙한 언어에서는 컴파일러가 코드를 매우 효과적으로 최적화 할 수 있습니다. 그러한 언어에는 더 간결한 코드가 더 나은 수행 코드라고 가정 해야하는 원인이 있습니다. Ruby와 같은 새로운 성능 최적화 언어에는 C/C ++ 컴파일러의 컴파일러 최적화 기능이 부족하지만 간결한 코드가 더 잘 수행된다고 믿는 이유는 거의 없습니다. 현실은 우리는 프로덕션이 생산에 들어가고 프로파일 링 될 때까지 코드가 생산에서 얼마나 잘 수행 될지 알지 못한다는 것입니다. 단순하고 무해한 기능은 코드 내의 충분한 위치에서 호출되면 성능 병목 현상이 될 수 있습니다. 동시 시스템에서 가장 큰 병목 현상은 일반적으로 동시성 알고리즘이 열악하거나 과도한 잠금으로 인해 발생합니다. 이러한 문제는 "Concise"코드를 작성하여 거의 해결되지 않습니다.

결론은 이것입니다 : 제대로 수행하지 않는 코드는 프로파일 링이 병목 현상이라고 판단되면 항상 리팩토링 될 수 있습니다. 코드는 이해하기 쉬운 경우에만 효과적으로 리팩토링 할 수 있습니다. "간결한"또는 "영리"로 작성된 코드는 종종 리팩토링하고 유지하기가 더 어렵습니다.

인간의 가독성에 대한 코드를 작성한 다음 필요할 때 성능을 위해 리팩터를 리팩터링하십시오.

내 두 센트 ...

암호 짧고 콘크리트이며 집중해야합니다. 당신은 항상 많은 단어로 아이디어를 설명 할 수 있습니다. 코멘트.

코드를 댓글을 달 수있는 한 코드를 짧거나 컴팩트하게 만들 수 있습니다. 이렇게하면 코드를 최적화 할 수 있지만 여전히 성장할 수 있습니다. 나는 설명적인 변수와 방법, 그리고 여전히 불분명 한 경우 어딘가에있는 중간에 머무르는 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top