부작용 최소화 (이상적으로는 없음)
자체 범위를 벗어난 상태로 3 가지 변경을 일으키는 함수는 단지 무언가를 입력하고 다른 것을 출력하는 것보다 추론하고 유지하기가 훨씬 어렵습니다. 함수가 무엇을하는지 알 수 없으며, 그 기능을 기억하고 다른 모든 관련 기능에 미치는 영향을 기억해야합니다.
OOP의 경우 부작용을 최소화한다는 것은 멤버 함수가 클래스 상태를 수정할 수있는 멤버 수가 적은 클래스를 의미합니다. 멤버 함수가 자체 상태를 넘어서 상태를 수정할 수 있고 부작용이있을 수 있기 때문입니다 (예 : 클래스의 내부를 조작 할 수 있음). 또한 더 적은 수의 데이터 멤버가있는 클래스를 의미하므로 해당 메소드가 조작 할 수있는 상태가 적고 부작용이 적을 수 있습니다.
간단한 예로, sorted
이진 검색을 수행할지 선형 검색을 수행 할지를 결정하는 데 사용 되는 상태를 유지할 수있는 멋진 데이터 구조를 설계한다고 상상해보십시오 . 이 경우 디자인을 두 개의 클래스로 분리하는 것이 유용 할 수 있습니다. sorted
정렬되지 않은 클래스를 호출 하면 내용이 항상 정렬 된 다른 클래스의 데이터 구조가 반환 될 수 있습니다. 이제는 부작용이 적고 (오류가 발생하기 쉽고 코드를 이해하기 쉬워 짐) 널리 적용되는 코드 (이전 설계는 분류 할 필요가없는 소형 어레이의 처리 및 인간의 지적 효율성면에서 낭비가됩니다).
불필요한 외부 종속성을 피하십시오
13 개의 서로 다른 라이브러리를 사용하여 비교적 간단한 작업을 수행함으로써 최대 코드 재사용으로 상상할 수있는 가장 간결한 코드를 구현할 수 있습니다. 그러나 이는 13 개의 다른 라이브러리 중 적어도 일부를 이해하도록함으로써 독자에게 지적 오버 헤드를 전달합니다. 이 고유 한 복잡성은 기능을 수행하기 위해 12 개의 다른 라이브러리를 가져 와서 구축해야하는 타사 라이브러리를 구축하고 이해하려는 모든 사람에게 즉시 인식되어야합니다.
이것은 아마도 논란의 여지가 있지만 최종 결과가 잘 테스트 된 경우 (여러 번 중복 테스트되지 않은 결함이있는 코드보다 나쁘지 않은) 반대의 극단적 인 코드 복제를 선호합니다. 3 줄의 중복 코드를 선택하여 벡터 교차 곱을 계산하거나 3 줄의 코드를 없애기 위해 서사시 수학 라이브러리를 가져 오는 경우 전체 팀 이이 수학 라이브러리를 사용하지 않는 한 전자 제안을 제안합니다 이 시점에서 디커플링 이점과 비교하여 사소한 경우 1 대신 3 줄의 코드를 작성하는 것이 좋습니다.
코드 재사용은 밸런싱 행위입니다. 위에서 저장 한 3 줄의 간단한 코드에서 독자와 관리자가 3 줄의 코드보다 훨씬 많은 정보를 이해해야하는 비용이 발생하기 때문에 너무 많이 재사용하고 일대 다 방식으로 지적 복잡성을 전가합니다. . 또한 수학 라이브러리가 변경되면 코드도 변경 될 수 있으므로 코드의 안정성이 떨어집니다. 너무 적게 재사용하고 지적 오버 헤드를 곱하면 코드가 중단되어 중앙 개선의 혜택을 얻지 못하므로 균형 잡기 행동이지만 균형 잡힌 행동이라는 아이디어는 모든 작은 형태의 겸손한 중복을 없애려고 시도 할 때 언급 할 가치가 있습니다. 그렇지 않으면 반대의 극단적 인 것보다 유지하기 어려운 결과를 가져옵니다.
크랩 테스트
이것은 주어진 것이지만 코드가 모든 입력 사례를 처리하지 않고 일부 사례를 놓친 경우 다른 사람들이 자신의 눈과 손으로 옮겨지기 전에 직접 얻지 못했던 코드를 유지하도록 어떻게 기대할 수 있습니까? 처음에는 전혀 적합하지 않은 코드는 물론 완벽하게 작동하는 코드를 변경하기에는 충분히 어렵습니다.
게다가 철저한 테스트를 통과 한 코드는 일반적으로 변경해야 할 이유가 적습니다. 변경할 필요가없는 안정적인 코드는 유지 보수 비용이 들지 않기 때문에 유지 관리 성보다 훨씬 성가신 안정성과 관련이 있습니다.
인터페이스 문서
문서화에 동등한 시간을 할애 할 수 없다면 "일을하는 방법"보다 "일을하는 것"의 우선 순위를 정하십시오. 가능한 모든 입력 사례에서 수행 할 작업 (또는 최소한 수행해야 할 작업)에 대한 의도가 분명한 명확한 인터페이스는 자체 구현에 대한 컨텍스트의 명확성을 제공하여 방법뿐만 아니라 코드를 사용하는 방법과 작동 방식도
한편 사람들이해야 할 일조차 모르는 이러한 특성이 결여 된 코드는 구현 세부 정보가 아무리 잘 문서화되어 있든 SOL입니다. 소스 코드가 구현되는 방법에 대한 20 페이지 매뉴얼은 처음에 어떻게 사용되는지, 가능한 모든 시나리오에서 어떻게해야하는지 정확히 알 수없는 사람들에게는 가치가 없습니다.
구현 측면에서는 다른 사람과 다르게 수행 한 내용을 문서화하십시오. 예를 들어, 인텔은 레이트 레이싱 커널에 대한 경계 볼륨 계층 구조를 가지고 있습니다. 이 분야에서 일하고 있기 때문에 문서를 살펴 보지 않고도 코드가 수행하는 작업을 한눈에 파악할 수 있습니다. 그러나 그들은 BVH를 통과하고 광선 패킷을 사용하여 병렬로 교차로를 수행한다는 아이디어 인 독특한 일을 합니다 . 코드의 해당 부분은 대부분의 역사적 BVH 구현에서 이국적이고 특이하기 때문에 문서의 우선 순위를 정하고 싶습니다.
가독성
이 부분은 매우 주관적입니다. 나는 인간의 사고 과정에 가까운 종류의 가독성에 대해서는별로 신경 쓰지 않습니다. 저자가 문제를 해결하기 위해 기괴하고 복잡한 사고 과정을 사용하는 경우 가장 높은 수준의 사물을 설명하는 가장 잘 문서화 된 코드를 따라 가기가 여전히 어렵습니다. 한편 2 ~ 3 개의 문자 이름을 사용하는 간결한 코드는 논리가 매우 간단한 지 이해하기 쉽습니다. 나는 당신이 동료 리뷰를 검토하고 다른 사람들이 선호하는 것을 볼 수 있다고 생각합니다.
나는 주로 유지 보수성 및 더 중요한 안정성에 관심이 있습니다. 변경할 이유가없는 코드는 유지 보수 비용이없는 코드입니다.