읽을 수 있고 쉽게 관리 할 수있는 코드를 작성했는지 어떻게 알 수 있습니까?


336

자신이 만든 코드를 쉽게 읽고 이해하고 유지 관리 할 수 ​​있는지 어떻게 알 수 있습니까? 물론 저자의 관점에서 볼 때, 코드는 처음부터 작성하고 편집했기 때문에 코드를 읽고 유지 관리 할 수 ​​있습니다. 그러나 우리의 직업이 코드를 측정 할 수있는 객관적이고 정량화 가능한 표준이 있어야합니다.

이러한 목표는 원래 작성자의 전문가 조언 없이 코드 를 사용 하여 다음을 수행 할 수있을 때 충족됩니다 .

  • 코드를 읽고 기본 수준에서 논리의 흐름을 이해할 수 있습니다.

  • 입력, 출력 및 알고리즘을 포함하기 위해 코드가 수행하는 작업을보다 심도있게 이해할 수 있습니다.

  • 다른 개발자는 버그 수정 또는 리팩토링과 같은 원래 코드를 의미있게 변경할 수 있습니다.

  • 원래 코드를 활용하는 클래스 또는 모듈과 같은 새로운 코드를 작성할 수 있습니다.

코드 품질을 수치화하거나 측정하여 코드를 읽을 수 있고 이해 가능하며 유지 관리 할 수있는 방법을 알 수 있습니까?


154
의무적 인 링크 ( xkcd 에 한 번은 안됨 ) : osnews.com/images/comics/wtfm.jpg
Jerry Coffin

3
나는 당신이 그것을 볼 때 그것을 잘 알고 있다고 말하지만 이 주장은 근본적으로 결함이 있고 원래의 형태조차도 부끄러워했으며 소스 코드에는 적용되지 않았습니다.
Konrad Rudolph

6
"물론 당신의 관점에서 코드를 읽을 수 있습니다"– 분명하지 않습니다!
UncleZeiv

24
나는 당신이 그것을 쓴 후 몇 개월이 지나면 그것을 알 수 있다고 말하고 싶습니다.
JeffO

2
@asfallows : 아내에게 몇 가지 코드를 보여 주었고, 코드를 읽을 수 있기 때문에 코드가 잘못되었다고 생각했습니다! (영어로 된 단어가 너무
많고

답변:


370

코드를 검토 한 후 동료가 알려줍니다.

저자는 코드 자체가 말하는 것 이상을 알고 있기 때문에 스스로 결정할 수는 없습니다. 그림이 예술인지 아닌지를 알 수없는 것과 같은 이유로 컴퓨터는 말할 수 없습니다. 따라서 소프트웨어를 유지 관리 할 수있는 다른 사람이 필요하므로 작성한 내용을보고 의견을 제시해야합니다. 상기 프로세스의 공식 명칭은 피어 리뷰 입니다.


6
경험적 테스트를 능가하는 것은 없습니다.
세계 엔지니어

25
+1 가장 중요한 대상은 작업중인 문제의 원인과 해결 방법 및 그 해결 방법을 이해하는 데 동참 한 동료입니다. 좋은 코드는 동료 그룹의 현재 이해를 반영합니다. 팀이 유능하고 사려 깊으며 새로운 아이디어에 개방적이라고 가정하면 "귀하의 동료가 당신에게 좋은 / 유지 가능성을 말해주는 것은"내 경험상 다른 어느 때보 다 더 나은 정의입니다.
Doug T.

69
내 경험상, 이것은 동료가 좋은 점과 나쁜 점을 알고있을 때만 작동합니다. 그렇지 않으면 다음과 같이 들릴 것입니다. "코드를 찾기가 더 쉬운 동일한 방법으로 해당 코드를 작성해야합니다"
Rangi Lin

12
@RangiLin, 동료가 옳을 수도 있습니다.

11
@Rangi 당신은 당신이 가진 동료와 함께 일해야합니다. 코드가 어려울 경우 코드에 문제가있는 것입니다. 장기적으로, 당신이 그들을 교육, 또는 아, 네 ... (당신이 이동하거나이 채용 과정에 영향을 미칠 수있는) 좋은 동료를 얻기 위해 시도 할 수 할 수는 항상 잘 할 수 있다는 것을 기억합니다.
MarkJ

220

때로는 가장 좋은 방법은 6 개월 전에 작성한 코드로 돌아와서 작성된 내용을 이해하고 이해하는 것입니다.

빨리 이해한다면 읽을 수 있습니다.


28
그래, 그게 좋은 것 같고 사실이지만, 오늘 무엇을 어떻게해야할지 결정하는 것은 좋지 않다 ...
Michael Durrant

10
해부에는 시간이
오래 걸리고

3
첫 번째 재 방문을 위해 한 달 또는 그 이하로 다시 방문하는 기간을 단축 할 수 있습니다. 나는 그것이 프로젝트와 도메인의 복잡성과 당신의 정신적 접근에 달려 있다고 생각합니다. 6 개월 만에 실제 가독성 대신 코드를 처음 작성한 이후 배운 도구 나 기술을 사용하여 리팩토링 또는 최적화 기회를보고 산만 해집니다.
Chris Bye

1
@MichaelDurrant 이전 코드를 검토 할 때마다 다르게 작성된 조각을 찾은 다음 "오늘"작성하는 코드를 고려합니다. 예, 좋은 코드를 작성하는 방법을 배우려면 시간이 걸립니다.
dj18

1
@MichaelDurrant 6 개월 전에 어떤 불명확 한 일을 배울 수 있고 오늘 그 일을하지 않기 때문에 여전히 종류입니다.
djechlin

94

그것은:

  1. 유지 보수 당신이 그것을 유지할 수 있다면 .
  2. 도움을 요청하지 않고 다른 사람이 유지할 수있는 경우 쉽게 유지 관리 가능
  3. 다른 사람이 읽을 때 디자인, 레이아웃 및 의도를 올바르게 이해하면 읽을 수 있습니다.

1의 실제 테스트는 ( 파리의 Alexquant_dev가 말했듯이) 몇 달 후에 다른 것을 수행하여 다시 가져올 수 있다는 것입니다.

2와 3에 대한 테스트는 다른 사람이 그것을 집어 들고 디자인의 결정을 따르는 동안 코드를 확장하거나 수정하는 방법을 알아내는 것입니다. 그들은 디자인을 이해할 수없는 경우,이 문제 영역에 어떻게 관련되는지, 또는 코드가되는 방법을 목적으로 사용되는, 그들은 대신 곡물에 걸쳐 솔루션을 해킹 수 있습니다.

경험 법칙, 원칙 (예 : 누군가가 잘 작성하고 이름을 부여한 법칙)과 올바른 방향으로 이끌거나 일반적인 함정에서 벗어날 수있는 모든 종류의 제안이 있습니다. 그러나 그들 중 누구도 당신이 요구하는 자질을 보장하지는 않습니다.


2
버그를 수정하거나 기존 행동 을 유지 보수성 요인으로 수정하는 데 소요되는 시간을 고려하는 것은 어떻습니까? 동일한 변경 작업을 수행하는 데 시간이 덜 걸리는 코드는 유지 관리가 더 쉬워야합니까?
VCD

1
달려있다; 때로는 수정 작업을 잘 수행하려면 리팩토링이 필요합니다 (특별한 경우 해킹보다 시간이 오래 걸리는 리팩토링 (알기 쉬운 코드는 그것을 사용하지 않기 때문에 필요합니다)) ).
쓸모없는

30

코드가 SOLIDDRY 의 원칙을 따르고 그 주위에 우수한 단위 테스트 세트가있는 경우 유지 관리가 가능할 것입니다.

읽을 수 있습니까? 읽어. 메소드와 변수 이름이 의미가 있습니까? 문제없이 프로그램 로직을 따를 수 있습니까? 대답이 예이면 코드를 읽을 수 있습니다.


8
... 읽고 나면 다른 사람에게 나누어 읽으십시오.
jcmeloni

19
이것은 특히 좋은 테스트가 아닙니다. 이러한 규칙의 많은 응용 프로그램은 주관적이므로 거의 항상 자신의 코드를 작성한 후에 읽을 수 있습니다.
DeadMG

1
"답이"예 "이면 코드를 읽을 수 있습니다 . ... ... 다른 사람이 읽을 수 있는지 확인하려면 다른 사람이 읽을 수 있어야합니다.

2
IMO, SOLID가 과대 평가되었습니다. 특히 'S' 그 또는 모두가 그것을 잘못 읽습니다.
Erik Reppen

DRY와 SOLID이지만 끔찍한 코드에 수많은 시간을 보냈습니다. 다음 원칙을 따르면 글을 쓰고있는 것이 쓰레기가 아니라는 잘못된 인상을 줄 수 있습니다.
야 쿠브 아놀드

24

유지할 수없는 코드 작성 방법 읽기 -Roedy Green, 웃음, 학습 을 통해 평생 일자리를 확보하십시오 .

... 유지하기 어려운 코드를 작성하는 방법, 당신을 따르는 사람들은 가장 간단한 변화를 만들기 위해 몇 년이 걸릴 것입니다. 또한,이 모든 규칙을 종교적으로 준수한다면 아무도 자신을 평생 고용 보장 할 것입니다.

이 에세이는 많은 재미있는 예제를 사용하여 잘못된 코드를 작성하는 방법에 대한 수많은 예제를 제공합니다. 또한 글로벌 이름의 개인 재사용 이라는 높은 평가를받는 기술인 Creative Miss-spelling , Reuse of Names 를 사용하는 방법을 계속 설명합니다 .

유머러스하게, 에세이는 읽을 수없고 유지할 수없는 코드의 모든 예를 피하는 방법을 알려줍니다.

실제로, 나는 누군가가 본문의 예제와 유사한 코드를 작성할 것이라고 믿기가 어렵다. 그때 학교에서 신선했습니다. 그러나 몇 년 동안 일한 후 매일 텍스트의 코드가 표시됩니다.


참조 waterfall2006.com/gorman.html 자신 이외의 다른 사람에 의해 완전히 이상 유지할 만들기, 작은, 가역적 변화의 시리즈를 통해, Refuctoring 코드의 welldesigned 조각을 복용하는 과정입니다.
Sjoerd

22

어떻게 보이는지에도 불구하고 고려할 수있는 상당히 객관적인 조치가 있습니다. C ++ 코딩 표준 , 리팩토링클린 코드 와 같은 책 에는 의미있는 이름, 함수 크기, 커플 링 및 응집력과 같은 원리, 객체 디자인, 단위 테스트, 연속적인 수정 등과 같은 것을 살펴보면서 코드를 판단 할 수있는 긴 기준 목록이 있습니다.

목록이 너무 커서 점검 목록을 처리 할 수는 없지만 책을 읽고 몇 가지 중요한 사항을 고른 다음 몇 개월 후에 다시 읽으면 더 향상됩니다.


4
점진적 학습을 위해 +1하고 밤새 완벽 해 지려고하지 않음
dj18

19

증거는 푸딩에 있습니다. 합리적으로 유능한 사람에게 건네면 어떻게되는지보십시오. 코드의 난이도와 관련하여 많은 질문을 할 필요가 없다면 잘한 것입니다.

이것은 내 경력의 초기 교훈이었습니다. 멘토는 "모든 것을 문서화하여 나중에 프로그램을 빠져 나갈 수 있도록한다. 대답이 마음에 새겨질 때 질문을 예상하지 않으면, 그렇지 않은 경우 질문을 파악해야한다"고 말했다.


10
사람들이 자신의 무지를 드러 낼 염려 때문에 질문하는 것을 삼가도록주의하십시오. 사람들은 노출을 자제하려는 경향으로 인해 처음부터 '합리적으로 유능한'사람들로 인식 할 수 있습니다. 따라서 당신이 둘 다 진실하다는 것을 알지 못한다면 질문의 부족은 좋은 것이 아닐 수도 있습니다.
Hermann Ingjaldsson

1
@HermannIngjaldsson-충분합니다. 물론 그들이 유능하지 않고 무언가가 깨지면 곧 알게 될 것입니다. "도움!!!!"
MathAttack

이것은 단순히 최고 답변
gnat

17

나는 모든 대답을 읽었으며 아무도 코드 복잡성을 언급하지 않았다.

코드 복잡성과 가독성 / 유지 보수성은 밀접한 관련이 있습니다. 코드 복잡성 스코어링 알고리즘에는 여러 가지가 있지만 McCabe 복잡성 스코어링의 작동 방식에 대해서만 이야기하겠습니다.

기본적으로 McCabe 점수는 코드를 통해 읽고 고유 한 "경로"수를 계산합니다. McCabe를 분자로 사용하고 코드 줄을 분모로 사용하면 "가독성"에 대한 근사치도 얻을 수 있습니다.

10 줄의 코드가 있고 해당 코드를 통해 300 개의 경로가있는 경우 유지 관리가 불가능한 코드 (안전하고 쉽게 변경하기 어려움)이며 읽을 수는 없습니다. 반대로 300 줄의 코드가 있지만 경로가 하나 뿐인 경우 (조건이 없음) 읽기 쉽고 유지 관리가 쉽습니다.

그러나 McCabe가 쓰러지는 곳은 후자의 예입니다. 조건이없는 300 줄의 코드가 있다면, "복사 / 붙여 넣기 재사용"을했을 가능성이 매우 높으며, 이는 역시 좋지 않습니다. 따라서 중복 또는 거의 중복 된 코드 감지와 같이 McCabe 외에도 시스템 전체에 적용되는 메트릭이 있습니다.


2
이것이 답이되어야합니다. 법안. 다른 답변은 사실보다 더 많은 의견입니다. 이해할 수 있다면 좋을까요? 복잡도 분석을 사용하여 먼저 측정 한 다음 복제 등을 찾기 위해 인간 리팩터링
Jon Raynor

1
LOC로 나눈 McCabe 점수의 단점을 언급하는 마지막 단락은 오히려 전체 아이디어를 무효화하는 경향이 있습니다. 코드를 통해 300 개의 경로 가 필요한 경우 왜 더 많은 행을 사용하도록 코드를 유지 관리하기 쉽게 만드는가? 그것은 책이 복잡한 아이디어를 제시한다면, 간결하게 의사 소통을하기보다는 정말로 큰 책 이어야한다는 것을 말하는 것과 같습니다 . -1.
와일드 카드

8

코드가 "모듈"에 내장되어 있다면 모듈에서 한 가지를 변경하여 쉽게 전체를 사용할 수 있다는 것을 의미합니다. 관련없는 것들 사이의 영향을 제거합니다. 또한:

  • 재사용이 쉬운 코드
  • 코드가 유연합니다 (모듈 빌드와 관련됨)
  • 건조-스스로 반복하지 마십시오

나는 Pragmatic Programmer를 읽는 것이 좋습니다.


8

일부 테스트 / 표시기 :

  • IDE를 끕니다. 여전히 자신의 코드를 읽을 수 있습니까? 버그가있는 경우 손으로 버그를 추적하고 문제가있는 부분을 파악하기 위해 중단 점이 필요한 클래스를 파악하는 것이 상당히 쉬운가요? 또는 IDE를 사용할 때 처음부터 귀찮게하지 않고 단지 단계적으로 진행합니까?

  • 디버그는 종종 하나의 버그를 수정하여 2+ 이상을 만드는 wack-a-mole 게임이됩니까?

  • 트리거 풀에서 실제로 발생하는 유용한 것까지 얼마나 많은 메소드 호출이 필요합니까? 정확히 동일하거나 대부분의 동일한 정확한 매개 변수를 다른 메소드 호출에 전달하는 메소드는 몇 개입니까?

  • 클래스에 간단한 새 메소드를 추가하기 위해 얼마나 많은 파일을 열어야합니까?

  • 채택한 패턴과 관행을 생각하십시오. 그들이 완벽하게 이해했거나 누군가가 "그게 유일한 방법"이라고 당신을 설득했기 때문에 그렇게 했습니까? 또는 이력서에 원했거나 rockstar 개발자가 그렇게 말했기 때문입니다.


3
IDE가없는 코드를 읽는 것은 특히 가독성의 척도 인 것처럼 보일 수 있습니다. 이러한 유형의 메트릭은 헝가리 표기법 스타일 "솔루션"을 초래하여 결국 가독성을 떨어 뜨립니다.
rubenvb 2016 년

8

그가 만든 코드를 쉽게 유지 관리하고 읽을 수 있는지 어떻게 알 수 있습니까?

다음과 같은 속성을 찾아서 유지 관리하기 쉽고 읽을 수있는 코드를 찾을 수 있습니다.

  1. 객체, 메소드 및 / 또는 함수는 항상 한 가지 일을합니다.
  2. 방법 및 / 또는 기능은 간결합니다 ( "간결하지만 포괄적"으로).
  3. 객체, 메소드 및 / 또는 함수는 본질적으로 이름을 기반으로해야한다고 생각하는 것을 수행합니다.
  4. 재사용 예정 코드는 실제로 재사용 가능합니다.
  5. 마지막으로, 코드를 즉시 단위 테스트 할 수 있다면 최소한 단일 책임 모듈 식 코드를 작성했을 가능성이 큽니다.

지저분하고 유지하기 어려운 코드를 작성했는지 어떻게 알 수 있습니까? 지저분한 소프트웨어를 개발했는지 알 수있는 구성이나 지침이 있습니까?

  1. 방법을 통해 읽고 있는데 의도가 무엇인지 명확하지 않은 경우, 이는 최상이 아니며 최악의 경우 유지 관리가 불가능할 수 있습니다.
  2. 단순 해 보이지 않으면 간단하지 않을 수 있으며 이는 곧 유지 관리 할 수 ​​없게 될 유지 관리 할 수없는 코드 또는 코드의 표시입니다.
  3. 코드베이스에 대칭 (일관성)이없는 경우 유지 관리 할 수없는 코드를보고있을 수 있습니다.

리팩토링 예제가 더 명확하지 않다고 동의합니다. 나는 원래 코드가 작동해야한다는 데 동의하지만, 명확성과 의사 소통의 관점에서 원래는 훨씬 낫다고 생각합니다. 정규식을 도입하는 동안 선명도가 향상된다고 주장하는 리팩토링이 매우 의심됩니다.
Roy

1
@ 로이, 예, 충분합니다. 아마도 그 코드 샘플을 추가하지 않았을 것입니다. 물론, 거의 3 년 전 이었지만 지금도 PHP를 사용하지 않았을 것입니다. (지금보고있는 것만으로도 크롤링하고 있습니다.) 정규 표현식을 사용해서는 안됩니다. 아무리 간결해도 정규식은 즉시 꺼집니다. 대답을 편집하고 코드 샘플을 삭제합니다. 의견 주셔서 감사합니다.
Wil Moore III

물체는 어떻게 한 가지 일을 할 수 있습니까?
Koray Tugay

@KorayTugay 이런 식으로 생각하십시오. 물체가 단일 응집성 개념 이상을 묘사하고 있다면 냄새가납니다.
Wil Moore III

6

한마디로 Experience .

시작하려면 기초 작업을해야하므로 프로그래머가 리팩토링 (Refactoring ) 과 같은 책을 읽는 데 더 많은 시간을 할애하는 것이 좋습니다. 코드를 유지하는 능력, 우리 분야에서 가장 잘 알려진 인재들이 작성했으며 코드가 깨끗하고 읽기 쉬운 지 확인하기 위해 이해해야하는 거의 모든 것을 설명하는 Clean Code .

그러나 많은 양의 독서는 어려운 경험을 대신 할 수 없습니다. 코드 품질에 대한주의가 가져올 수있는 차이를 충분히 이해하려면 코드를 다루어야합니다. 깨끗하고 체계적인 코드 작업의 즐거움과 코드 스파게티 작업의 어려움을 경험하면서이 책의 ​​저자가 실제로 무엇을 가르치려고했는지 더 잘 이해하는 법을 배웁니다. 실제 라이브 프로덕션 코드, 실제 작업 품질이 중요하고 매일 코드로 쉽게 작업 할 수있는 능력에 영향을 미칩니다.

또한 훌륭한 멘토 나 경험이 풍부한 동료가 코드 작성에 노력을 기울이고 있음을 확인하는 데 도움이됩니다. 이것이 바로 코드 검토가 유용한 이유 중 하나입니다. 코드 검사 및 서식 도구를 사용하면 작업을 깨끗하게 유지하는 데 도움이됩니다. 그러나 수년간의 소프트웨어 작성을 통해 얻은 경험과 비교할 수있는 것은 아무것도 없으며, 유지 관리가 용이하도록 깨끗하고 읽기 쉽고 체계적으로 작성된 코드를 자동으로 찾을 수 있습니다. 긴.


3

청렴하지 않고 기능적 스타일을 선호하십시오. 요즘 대부분의 언어 (.NET, Ruby, Python, Javascript 등)는이를 지원하고 홍보합니다 (예 : LINQ, 밑줄).

매우 읽기 쉽습니다.

var recentTopCustomers = OrderList
    .Where(o => o.Date >= DateTime.Now.AddDays(-5))
    .Where(o => o.Amount > 1000)
    .OrderBy(o => -o.Amount)
    .Take(10)
    .Select(o => o.Customer);

그것은 각 노드가 목적의 명확성을 위해 하나의 집중된 의도 대출을 갖도록 강요합니다. 또한 개별 작업이 분리되어 분리되어 연결되고 다른 끝으로 노드 (작업)를 다시 정렬하는 것은 쉽지 않습니다. 이것은 유지 보수가 용이합니다.


2

읽을 수 있고 유지 관리 가능한 코드 : 프로그래머가 처음 에는 쉽게 이해할 수있을 정도로 충분히 이해할 수있는 코드입니다 .

  • 인터페이스를 통해 다시 사용하거나
  • 디버깅하거나
  • 행동을 바꾸십시오. (기능 추가 / 제거) 또는
  • 그것을 최적화
  • 그것을 테스트

이것은 '명확성'으로 귀결됩니다. 즉, 프로그래머는 예상치 못한 부작용을 일으키지 않고 현재 작업을 수행하기 위해 '충분히 무엇을 이해하는지'확인하기 전에 특정 코드 세그먼트에 대해 몇 가지 질문을해야합니까?

스티브 맥코넬 (Steve McConnell)의 '코드 완성 (Code Complete)'이라는 책은 이에 대해 자세히 설명합니다.

코드의 품질이 좋은지 판단하는 데 사용할 수있는 다양한 메트릭을 살펴 봅니다.

예를 참조하십시오 : http://books.google.co.uk/books?id=3JfE7TGUwvgC&lpg=PT376&pg=PT389#v=onepage&q&f=false


이것은 이전 답변에서 만들어지고 설명 된 점들에 비해 실질적인 것을 추가하지 않는 것 같습니다
gnat

필자가 추가하는 가장 중요한 것 중 하나는 Code Complete에 대한 참조이며 이전 답변에서는 언급하지 않았습니다. 이 책은 읽기 쉽고 유지 관리 가능한 코드 작성에 중점을 둔 가장 중요하고 영향력있는 책 중 하나입니다. 이 책을 읽은 사람은 '읽고 쉽게 관리 할 수있는 코드를 작성했는지 어떻게 알 수 있습니까?'라고 묻지 않아도됩니다.
JW01

... 제 생각에, 유지 관리 가능한 코드 작성에 관심이 있다면 누구나 얻을 수 있는 가장 좋은 것은 그 책을 읽는 것입니다. 따라서, (종종 많은 분 SO 사회자보다 더 생각입니다)주의 사상의 많은 분으로, 나는 이것이, 영업 이익의 질문에 적절한 대답뿐만 아니라 생각 최고 .
JW01

2

부작용 최소화 (이상적으로는 없음)

자체 범위를 벗어난 상태로 3 가지 변경을 일으키는 함수는 단지 무언가를 입력하고 다른 것을 출력하는 것보다 추론하고 유지하기가 훨씬 어렵습니다. 함수가 무엇을하는지 알 수 없으며, 그 기능을 기억하고 다른 모든 관련 기능에 미치는 영향을 기억해야합니다.

OOP의 경우 부작용을 최소화한다는 것은 멤버 함수가 클래스 상태를 수정할 수있는 멤버 수가 적은 클래스를 의미합니다. 멤버 함수가 자체 상태를 넘어서 상태를 수정할 수 있고 부작용이있을 수 있기 때문입니다 (예 : 클래스의 내부를 조작 할 수 있음). 또한 더 적은 수의 데이터 멤버가있는 클래스를 의미하므로 해당 메소드가 조작 할 수있는 상태가 적고 부작용이 적을 수 있습니다.

간단한 예로, sorted이진 검색을 수행할지 선형 검색을 수행 할지를 결정하는 데 사용 되는 상태를 유지할 수있는 멋진 데이터 구조를 설계한다고 상상해보십시오 . 이 경우 디자인을 두 개의 클래스로 분리하는 것이 유용 할 수 있습니다. sorted정렬되지 않은 클래스를 호출 하면 내용이 항상 정렬 된 다른 클래스의 데이터 구조가 반환 될 수 있습니다. 이제는 부작용이 적고 (오류가 발생하기 쉽고 코드를 이해하기 쉬워 짐) 널리 적용되는 코드 (이전 설계는 분류 할 필요가없는 소형 어레이의 처리 및 인간의 지적 효율성면에서 낭비가됩니다).

불필요한 외부 종속성을 피하십시오

13 개의 서로 다른 라이브러리를 사용하여 비교적 간단한 작업을 수행함으로써 최대 코드 재사용으로 상상할 수있는 가장 간결한 코드를 구현할 수 있습니다. 그러나 이는 13 개의 다른 라이브러리 중 적어도 일부를 이해하도록함으로써 독자에게 지적 오버 헤드를 전달합니다. 이 고유 한 복잡성은 기능을 수행하기 위해 12 개의 다른 라이브러리를 가져 와서 구축해야하는 타사 라이브러리를 구축하고 이해하려는 모든 사람에게 즉시 인식되어야합니다.

이것은 아마도 논란의 여지가 있지만 최종 결과가 잘 테스트 된 경우 (여러 번 중복 테스트되지 않은 결함이있는 코드보다 나쁘지 않은) 반대의 극단적 인 코드 복제를 선호합니다. 3 줄의 중복 코드를 선택하여 벡터 교차 곱을 계산하거나 3 줄의 코드를 없애기 위해 서사시 수학 라이브러리를 가져 오는 경우 전체 팀 이이 수학 라이브러리를 사용하지 않는 한 전자 제안을 제안합니다 이 시점에서 디커플링 이점과 비교하여 사소한 경우 1 대신 3 줄의 코드를 작성하는 것이 좋습니다.

코드 재사용은 밸런싱 행위입니다. 위에서 저장 한 3 줄의 간단한 코드에서 독자와 관리자가 3 줄의 코드보다 훨씬 많은 정보를 이해해야하는 비용이 발생하기 때문에 너무 많이 재사용하고 일대 다 방식으로 지적 복잡성을 전가합니다. . 또한 수학 라이브러리가 변경되면 코드도 변경 될 수 있으므로 코드의 안정성이 떨어집니다. 너무 적게 재사용하고 지적 오버 헤드를 곱하면 코드가 중단되어 중앙 개선의 혜택을 얻지 못하므로 균형 잡기 행동이지만 균형 잡힌 행동이라는 아이디어는 모든 작은 형태의 겸손한 중복을 없애려고 시도 할 때 언급 할 가치가 있습니다. 그렇지 않으면 반대의 극단적 인 것보다 유지하기 어려운 결과를 가져옵니다.

크랩 테스트

이것은 주어진 것이지만 코드가 모든 입력 사례를 처리하지 않고 일부 사례를 놓친 경우 다른 사람들이 자신의 눈과 손으로 옮겨지기 전에 직접 얻지 못했던 코드를 유지하도록 어떻게 기대할 수 있습니까? 처음에는 전혀 적합하지 않은 코드는 물론 완벽하게 작동하는 코드를 변경하기에는 충분히 어렵습니다.

게다가 철저한 테스트를 통과 한 코드는 일반적으로 변경해야 할 이유가 적습니다. 변경할 필요가없는 안정적인 코드는 유지 보수 비용이 들지 않기 때문에 유지 관리 성보다 훨씬 성가신 안정성과 관련이 있습니다.

인터페이스 문서

문서화에 동등한 시간을 할애 할 수 없다면 "일을하는 방법"보다 "일을하는 것"의 우선 순위를 정하십시오. 가능한 모든 입력 사례에서 수행 할 작업 (또는 최소한 수행해야 할 작업)에 대한 의도가 분명한 명확한 인터페이스는 자체 구현에 대한 컨텍스트의 명확성을 제공하여 방법뿐만 아니라 코드를 사용하는 방법과 작동 방식도

한편 사람들이해야 할 일조차 모르는 이러한 특성이 결여 된 코드는 구현 세부 정보가 아무리 잘 문서화되어 있든 SOL입니다. 소스 코드가 구현되는 방법에 대한 20 페이지 매뉴얼은 처음에 어떻게 사용되는지, 가능한 모든 시나리오에서 어떻게해야하는지 정확히 알 수없는 사람들에게는 가치가 없습니다.

구현 측면에서는 다른 사람과 다르게 수행 한 내용을 문서화하십시오. 예를 들어, 인텔은 레이트 레이싱 커널에 대한 경계 볼륨 계층 구조를 가지고 있습니다. 이 분야에서 일하고 있기 때문에 문서를 살펴 보지 않고도 코드가 수행하는 작업을 한눈에 파악할 수 있습니다. 그러나 그들은 BVH를 통과하고 광선 패킷을 사용하여 병렬로 교차로를 수행한다는 아이디어 인 독특한 일을 합니다 . 코드의 해당 부분은 대부분의 역사적 BVH 구현에서 이국적이고 특이하기 때문에 문서의 우선 순위를 정하고 싶습니다.

가독성

이 부분은 매우 주관적입니다. 나는 인간의 사고 과정에 가까운 종류의 가독성에 대해서는별로 신경 쓰지 않습니다. 저자가 문제를 해결하기 위해 기괴하고 복잡한 사고 과정을 사용하는 경우 가장 높은 수준의 사물을 설명하는 가장 잘 문서화 된 코드를 따라 가기가 여전히 어렵습니다. 한편 2 ~ 3 개의 문자 이름을 사용하는 간결한 코드는 논리가 매우 간단한 지 이해하기 쉽습니다. 나는 당신이 동료 리뷰를 검토하고 다른 사람들이 선호하는 것을 볼 수 있다고 생각합니다.

나는 주로 유지 보수성 및 더 중요한 안정성에 관심이 있습니다. 변경할 이유가없는 코드는 유지 보수 비용이없는 코드입니다.


1

새로운 팀원이 코드를 집어 이해하고 결함을 수정하고 비교적 쉽게 새로운 요구 사항을 충족하도록 수정할 수 있는지 알 수있는 한 가지 방법이 있습니다.


1

사용하고 싶은 기술은 다음과 같습니다.

동료 프로그래머 중 한 사람에게 코드를 보여주고 그 일을 설명하게하십시오. 이것들을 조심하십시오.

1) 코드 블록 리팩토링의 목적을 쉽게 설명 할 수없는 경우.
2) 현재 섹션을 이해하기 위해 다른 코드 섹션으로 이동 해야하는 경우 리 팩터하십시오.
4) 프로세스 중에 말하고 싶은 충동을 느낄 때마다 해당 코드 섹션에 리팩토링이 필요합니다. (코드 자체를 말하지 않습니다).


동료 프로그래머가 적어도 똑같이 경험이 있고 프로그래밍 언어와 관용구를 읽었다 고 가정합니다. 이와 같은 기술을 사용하는 사람들은 대부분의 주니어 팀 멤버조차 이해할 수 없도록 잘못된 표현으로 언어 표현의 하위 세트로 코드를 작성하는 사람들로 이어질 수 있습니다. 그 결과 언어의 멍청한 부분 집합에서 더 큰 코드가 만들어졌다. 언어 하위 집합을 얼마나 멍청하게 만들었 든 500KLOC의 작은 언어 하위 집합 코드는보다 표현적인 하위 집합을 사용하는 200KLOC 코드보다 항상 유지 관리하는 것이 좋습니다.
user1703394

이것은 단순히 최고 답변
gnat

-1

가장 유지 관리 가능한 코드는 존재하지 않는 코드입니다. 따라서 LOC 수를 추가하는 대신 LOC 수를 '감소시키는'새로운 코드 (단독으로 보았을 때 유지 보수가 약간 적더라도) 전체 코드베이스의 크기를 줄임으로써 유지 보수가 더 쉬워 질 수 있습니다. 따라서 유지 관리 가능한 코드의 기본 규칙은 다음과 같습니다.

  • 건조를 극대화하십시오.

둘째, 숨겨진 종속성보다 유지 관리 성이 나쁘지 않습니다. 규칙 2의 경우 :

  • 모든 종속성을 명시 적으로 만드십시오.

셋째, 모든 프로그래머가 특정 고급 기술 언어 기능 또는 관용구를 사용하여 유지 관리하거나 작성하는 데 동등하게 숙련 된 것은 아닙니다. 전체 코드베이스를 벙어리면 크기로 인해 유지하기 어려운 큰 코드베이스를 얻을 수 있습니다. 코드 전체에 고급 기술 기능과 관용구를 허용하면 모든 코드를 선임 개발자 만 유지할 수 있습니다. 유지 관리의 핵심은 기술 수준 기반 계층화입니다. 예를 들면 다음과 같습니다.

프로젝트 간 라이브러리 : 선임 개발자, 코드 / 이디엄 / 기법의 완벽한 뒷받침 프로젝트 특정 라이브러리 및 시스템 백엔드 : 중급 개발자는 가장 발전된 설명을하기가 어렵습니다. 선배들은이 코드를 통해 DRY 개선 기회를 찾을 것입니다.

프론트 엔드 : 주니어 개발자는 엄격한 스타일 가이드와 언어 구성 및 숙어를 사용하여 피해야합니다. Medior 개발자들은이 코드를 통해 DRY 기회와 숨겨진 비즈니스 로직을 찾습니다.

규칙 3의 경우 :

  • 개발자 기술 수준에 따라 코드를 계층화하고 그에 따라 유지 관리 가능한 코드를 작성하십시오.

나는


1
이것은 이전의 25 가지 답변에서 제시되고 설명 된 포인트를 넘어서는 실질적인 것을 제공하지 않는 것 같습니다
gnat

@ gnat, 나는 다른 답변에서 많은 (잠재적으로 유해한) 지나치게 단순화 된 것에 뉘앙스를 추가하기를 바랐습니다. 특히 포인트 3을 사용합니다.
user1703394

1
@ user1703394이 질문과 답변은 커뮤니티 위키입니다. 기존 답변이 개선 될 수 있다고 생각되면 "다른 사용자의 게시물 수정"권한이 없어도 편집 할 수 있습니다.

-2

읽기 쉽고 유지 관리가 쉬운 코드를 작성하는 것은 결코 쉽지 않지만 쉽게 유지 관리 가능한 코드를 작성하는 것은 어렵지 않습니다.

OOAD는 네 글자이지만 한 번에 이해하기 어렵습니다. 객체 지향 분석 및 설계를 따르십시오.

  1. 항상 좋은 요구 사항 수집 및 정확한 문제점 설명으로 시작하십시오.

    • 몇 가지 사용 사례로 시작하십시오. 시스템 사용자 대화
  2. 객체를 느슨하게 연결하고 코드가 반복되지 않도록해야합니다. DRY를 따르십시오. [반복하지 마십시오]

    • 복제본이 보일 때마다 캡슐화 할 장소를 찾으십시오.
  3. 코드가 확장을 위해 열려 있고 수정을 위해 닫힙니다-OCP [Open-closed 원칙]
  4. 코드를 항상 변경하면 항상 문제를 해결하기 위해 문제를 만들지 마십시오. IT 부서는 단순히 기존 기능을 수정하지 않습니다
  5. 코드 단위 테스트
    • 일이 잘못되면 항상 코드를 테스트하십시오.
  6. 기능에 대한 작업을 수행하는 동안 항상 기본 OOP (객체 지향 원칙) 및 기술을 따라야 응용 프로그램을 처음부터 잘 설계 할 수 있습니다.
    • 객체는 그들의 이름이 나타내는 것을해야합니다
    • 각 객체는 단일 개념을 나타내야합니다
  7. 시스템의 문제 설명 및 컨텍스트 / 도메인 소프트웨어 작동 방식을 항상 기억하십시오.
  8. 종이 작업도하세요.
    • UI 관련 자료 및 UML 다이어그램의 출력물이 항상 작동합니다.
    • 화이트 보드에서 브레인 스토밍 세션의 스크린 샷을 볼 수도 있습니다.
  9. 건축 레이아웃
  10. 가능하면 설계 원칙을 적용하십시오
  11. 문서
    • 항상 코드를 문서화하십시오
    • IDE에서 들여 쓰기를 설정하고 문서화하십시오.

1
코드는 코드 품질을 어떻게 정량화하거나 측정하여 읽을 수 있고 이해 가능하며 유지 관리가 가능한지 알고 있습니까? 질문
Jan Doggen

동의! 그러나 위에서 언급 한 원칙을 따르면 코드 품질을 쉽게 측정하고 읽을 수 있고 이해할 수 있으며 분명히 유지 관리 할 수 ​​있습니다. 틀린 점 있으면 지적 해주세요.
Narender Parmar

내 대답이 왜 다운 보트인지 모르겠습니다. 이미 주요 요점을 다루고 있습니다.
Narender Parmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.