이전에는 WPF 프로젝트에 적합한 TimeLine 컨트롤을 찾고있었습니다. 여기 에서 CodePlex 프로젝트로 안내 하는 답변을 찾았습니다 .
이제 문화 요구에 맞게 코드를 변경하고 싶습니다. 그러나 약간의 불일치가 있습니다!
내 질문은 :
수천 줄의 코드와 어떻게 상호 작용합니까?
편집하다:
어떤 지름길도 훌륭합니다!
이전에는 WPF 프로젝트에 적합한 TimeLine 컨트롤을 찾고있었습니다. 여기 에서 CodePlex 프로젝트로 안내 하는 답변을 찾았습니다 .
이제 문화 요구에 맞게 코드를 변경하고 싶습니다. 그러나 약간의 불일치가 있습니다!
내 질문은 :
수천 줄의 코드와 어떻게 상호 작용합니까?
편집하다:
어떤 지름길도 훌륭합니다!
답변:
그렇게 할 수있을만큼 충분히 이해했으면 소스 코드에 주석을 추가합니다. 점점 더 많이 이해할수록 이러한 의견을 적극적으로 리팩토링하십시오.
... 그리고 코드는 고맙습니다. ;-)
단일 조치를 취하고 코드를 디버그 (다시 반복)하여 해당 조치가 수행되는 방법을 찾으십시오. 더 나은 이해를 위해 간단한 언어로 같은 것을 쓰십시오!
Joel Spolsky가 블로그에서 기사를 찾지 못했을 때 (지금 기사를 찾을 수 없음) 실제로이 문제와 관련하여 나와 붙어있는 것 :
그는 코드가 어떻게 인간의 자연어가 아닌지, 프로그래머로서 우리는 그 코드에 대한 생각에 쉽게 빠져들 수 있고 그렇게 읽을 수 있어야한다고 말했다. 결과적으로 우리 중 많은 사람들이 새로운 코드를보고 마치 영어로 된 텍스트 블록 인 것처럼 "읽고"바로 이해할 수있을 것으로 기대합니다.
핵심은 느리고 체계적이고 과학적인 것입니다. 그리고 다른 사람들이 말했듯이 당신이가는대로 주석을 달고 리팩토링하십시오. "그냥보고 즉시 이해해야한다"는 사고 방식에 빠지지 마십시오.
아, 그래요, 난 여전히이 함정에 빠지기도합니다. "내가 아닌 내가 말한대로하십시오"그리고 그 모든 것. :)
SE-Radio는 Dave Thomas 와이 주제에 대해 인터뷰했습니다.
이 팟 캐스트 에피소드에는 프로젝트의 '문화'에 참여하고 원래 주민의 생활 방식을 이해하기위한 많은 팁과 기술이 있습니다.
최근 10 만 LOC 이상의 프로젝트로이 작업을 수행해야했습니다. 첫 번째 아이디어는 100,000 줄의 텍스트보다 100 또는 1000 노드의 그래프에서 패턴을 보는 것이 더 쉽다는 것입니다.
그래서 45 분을 보냈고 짧은 (<100LOC) Python 프로그램을 작성하여 필요한 것을 파싱하고 객체 관계를 그렸습니다. 정말 생성 하기 쉬운 언어 인 Graphviz 소스 를 생성했습니다. (파이썬에는 특별한 것이 없습니다 : 루비, C # 또는 커먼 리스프 (Common Lisp) 등 무엇이든 할 수 있습니다.)
다른 프로젝트에서는 사람들이 모듈 종속성, 호출 그래프, 버전 기록, 모든 종류의 작업에 Graphviz를 사용하는 것을 보았습니다. 최고의 프로그램 시각화 메타 도구.
(아마도 컴파일러를 사용 했기 때문일 수도 있지만 프로그래머가 문제에 직면했을 때 문제가 소스 코드에 프로그램에 관련된 경우를 제외하고는 항상 "프로그램 작성!"인 것 같습니다. :- )
새로운 대형 코드베이스를 이해하는 거의 유일한 방법 인 디버거가 실행될 때이를 단계별로 살펴보십시오.
충만에 대한 지름길이 실제로 없다는 것을 이해하십시오. (그리고 당신이 그 말에 문제가 있다면, 당신의 교육은 거의 무시되었습니다. 그것은 Robert A. Heinlein의 "이상한 나라의 낯선 사람"에서 온 것입니다.)
한 번에 한 페이지 씩, 한 번에 하나의 루틴을 읽으십시오. 의견을 추가하십시오. 주요 데이터 구조의 그림을 그립니다. 알고리즘을 인식합니다. 이전 지식을 활용하십시오.
디버거를 유혹하려는 유혹에 저항하십시오. 디버거 뷰포트가 너무 작습니다. 한 번에 한 줄만 표시되지만 실제로 어디에 있는지 또는 어디로 가고 있는지 알 수 없습니다.
주석 처리되지 않은 큰 코드 덩어리뿐만 아니라 모든 프로그래밍에서와 마찬가지로 가장 좋은 방법은 코드를 여러 조각으로 나누는 것입니다. 이것은 코드에서 시각적으로뿐만 아니라 머리에서도해야 할 일입니다. 이것은 큰 굵은 주석 또는 여러 줄 바꿈을 추가하는 것을 의미 할 수 있습니다. 조각을보기 위해 스크롤하는 동안 도움이됩니다. 논리적 인 코드 덩어리를 찾아보십시오.
물론, 당신이 비트를 이해함에 따라, 당신이 이해하지 못하는 것에 대해 메모 할 수 있도록 당시에 알고있는 것에 대해 주석을 답니다.
또한 처음부터 전체 부분을 이해하지 않는 것이 좋습니다. 대신 지금 알아야 할 부분을 이해하고 나중에 나머지 부분에서 작업하십시오.
복제 된 노드 를 적극적으로 사용 하여 @shadow 모드 에서 Leo Editor 를 사용하여 시작합니다 . 이를 통해 코드 를 변경하지 않고도 연구중인 각 코드 섹션에 대한 메모와 주석을 추가 할 수 있으며 주석은 해당 코드 옆에 항상 컨텍스트로 표시됩니다. 문서 작업 과정의 예는 다음과 같습니다.
예를 들어 Leo에서 버그를 수정하면 버그를 나타내는 일반 노드를 만듭니다. 이 버그 노드는 버그와 관련된 Leo 소스 코드의 모든 데이터에 대한 나의 견해입니다. 버그와 관련된 코드를 발견하면 해당 노드를 복제하여 버그 노드 아래로 옮깁니다. 또한 버그 노드의 자식으로 일반 노드를 추가하겠습니다. 이 노드에는 원래 버그 보고서, 버그 수정 방법에 대한 설명, 테스트 데이터 또는 유지하려는 기타 메모가 포함되어 있습니다.
버그 노드를 만든 후에는 해당 노드와 해당 하위 노드에만 집중합니다. 개요를 뛰어 넘지 않고도 버그 노드와 해당 자식을 검사 할 수 있습니다. 필요한 모든 것이 한 곳에 있습니다. 실제로 버그를 수정하려고 할 때 복제본을 변경하여 해결할 수 있습니다. 다시, 나는 윤곽선을 뛰어 넘을 필요가 없습니다. 전체 개요가 얼마나 크거나 복잡한지는 중요하지 않습니다. 나는 버그 노드와 그 자식만을 다루고 있습니다. 이 매우 좁은 초점은 버그를 훨씬 쉽게 수정합니다.
쓰기 테스트를 리팩터링하기 전에. 많은 테스트. 상속 된 엉망이 어떻게 작성되는지에 달려 있기 때문에 최소한 호출 가능한 작은 코드 블록에 대한 매우 구체적인 테스트.
테스트를 작성하는 것의 장점은 코드를 테스트하기 전에 코드에 대한 이해가 필요하다는 것입니다. 따라서 작성하는 모든 테스트는 약간의 지식을 얻게 될 것입니다. 또한 어설 션과 함께 가정을 사용하여 테스트에 크게 주석을 달 수 있습니다.
먼저 테스트를 수행하면 알 수없는 영향을 미치는 코드에서 무언가를 변경할 위험이 없습니다. 또한 코드를 리팩토링 할 때 안전망이 제공됩니다.
각 클래스의 기능을 이해하는 것보다 doxygen과 같은 도구를 사용하여 전체 클래스 다이어그램을 생성합니다.
그런 다음 버그 큐에서 몇 가지 쉬운 버그를 가져 와서 (매니저가 하드 버그를 할당하기 전에 : P) 해당 기능을 통해 디버거로 실행하여 대략적인 데이터 흐름 또는 코드 흐름 모델을 생성하려고합니다.
예를 들어 일부 소프트웨어의 내보내기 기능 : 소스 코드를 읽는 방법을 이해하려고합니다. 코드 (기본 인터페이스)에서 클래스와 코드 흐름 다이어그램을 사용하여 데이터가 올바르게 읽혀 지는지를 평가할 수 있습니다. 클래스 다이어그램과 플로우 차트가 있으면 이해의 절반이 완료되었다고 생각합니다.
기본적으로 깨끗한 코드를 작성하는 작업은 디자인에서 시작해야합니다. 우리가 OOP 언어로 코딩하는 경우 UML이 나오면 동료와 공유하고 디자인이 모호하지 않다는 것을 확신하십시오. 어쨌든 개발자는 디자인이 모호한 문제가 아니라 문제를 해결한다고 확신해야합니다.
코딩에 관해서는 디자인이 코드, 즉 Entity를 클래스 또는 구조체로 변환하고 작동하는 연산 등으로 변환되는지 확인해야합니다.
그리고 나는 백서 http://queue.acm.org/detail.cfm?id=2063168 를 통해 코딩 스타일 또는 공간, 들여 쓰기, 글꼴 변형을 사용하는 방법에 대해 이야기합니다. 대부분의 IDE는 MUCH를 작성하는 데 사용할 수 있습니다. 인간이 기계만큼 이해하는 CLEANER 코드. 코드가 단락 자체로 표시되도록 주석이없는 코드를 작성하는 데 더 많은 스트레스를줍니다.