이것은 다소 모호한 질문이지만 적절한 디자인에 대해 읽을 때 만족스럽지 못한 느낌을 받았습니다.
일반적으로 객체 지향 프로그래밍, 추상화, 팩토링 등을 배우면 디자인의 성배-그리고 그들이 항상 개발 기술을 사용한다고 주장하는 이유는 프로그램을 "쉬운 변경하기"만드는 것입니다. , "유지 가능", "유연성"또는 이러한 생산적인 사운드 개념을 표현하는데 사용되는 동의어 중 하나. ivar를 비공개로 표시하고 코드를 여러 개의 작은 자체 포함 된 방법으로 분할하고 인터페이스를 일반 상태로 유지하면 프로그램을 완벽하고 우아하게 수정할 수 있습니다.
비교적 작은 변화의 경우 이것은 나에게 효과적이었습니다. 클래스가 성능 향상을 위해 사용하는 내부 데이터 구조를 변경하는 것은 결코 큰 어려움이 아니며, 텍스트 입력 시스템을 재 설계하거나 게임 플레이 요소의 그래픽을 점검하는 등 API와 상관없이 사용자 인터페이스 끝도 변경되지 않았습니다. .
이러한 모든 변경 사항은 본질적으로 자체 포함 된 것으로 보입니다. 이들 중 어느 것도 관련된 코드 외부에서 수정되는 프로그램 구성 요소의 동작이나 디자인에 대한 변경은 포함하지 않습니다. 큰 기능이나 작은 기능을 사용하여 절차 적으로 또는 OO 스타일로 작성하는지 여부에 관계없이 중간 정도의 디자인만으로도 쉽게 변경할 수 있습니다.
그러나 변경 사항이 크고 털이 커질 때마다 (즉, API 변경) 내 소중한 "패턴"이 구조되지 않습니다. 큰 변화는 여전히 크며 영향을받는 코드는 여전히 영향을받으며 많은 시간이 걸리는 버그가 발생합니다.
제 질문은 이것입니다. 적절한 설계가 얼마나 큰 변화를 촉진 할 수 있다고 주장 하는가? 나에게 알려지지 않았거나 구현에 실패한 추가 디자인 기술이 실제로 끈적 거리는 수정을 간단하게 만들거나 그 약속 (많은 다른 패러다임에 의해 만들어진)에 대한 좋은 아이디어입니까? 소프트웨어 개발의 불변의 진실에서 완전히 분리 되었습니까? 툴 벨트에 추가 할 수있는 "변경 툴"이 있습니까?
특히, 내가 직면하고있는 문제는 포럼으로 이끌었습니다. 나는 해석 된 프로그래밍 언어 (D로 구현되었지만 관련이 없음)를 구현하기 위해 노력하고 있으며 클로저의 주장은 다음과 같아야한다고 결정했습니다. 현재 위치보다는 키워드 기반입니다. 익명 언어 함수를 호출하는 기존의 모든 코드를 수정해야합니다. 운 좋게도 언어 개발 초기 단계 (<2000 줄)이기 때문에 다소 작지만 나중에이 결정을 내렸다면 막대합니다. 그러한 상황에서, 설계에 대한 적절한 예측을 통해이 수정을 더 쉽게 만들 수 있었거나 본질적으로 광범위하게 영향을 미치는 특정 (대부분) 변경이있을 수있는 방법이 있습니까? 이것이 어떤 식 으로든 내 자신의 디자인 기술의 실패인지 궁금합니다.
분명히, 나는 OOP 나 일반적으로 사용되는 다른 패턴들에 대해 전혀 회의적이지 않다. 그러나 저에게는 그들의 미덕이 코드 기반을 유지 관리하는 것이 아니라 원본으로 작성되었습니다. 상속을 통해 반복적 인 패턴을 잘 추출 할 수 있으며, 다형성을 통해 기계 이해 효과 ( switch
문의 분기)가 아닌 사람이 이해하는 함수 (어떤 클래스)로 코드를 분리 할 수 있으며 작고 독립적 인 함수를 사용하면 매우 즐거운 "하단"스타일로 작성하십시오. 그러나 나는 유연성에 대한 그들의 주장에 회의적입니다.
foo metarg1: bar metarg2: baz
로 foo.metarg1_metarg2_(bar, baz)
. 그러나 내 언어는 더 큰 변경을하고 있습니다. 즉, 목록 기반 매개 변수를 사전 기반 매개 변수로 변경하면 런타임에 영향을 미치지 만 파서에는 영향을 미치지 않습니다 . 실제로 내 언어의 특정 속성으로 인해 지금 들어 가지 않습니다. 정렬되지 않은 키워드와 위치 인수 사이에 명확한 매핑이 없으므로 런타임이 주요 문제입니다.