태그 보관물: design

design

절대 변경되지 않는 하드 코딩 문자열 실제로 17

그래서 프랑스어로 동사를 (공 법적으로, 데이터 세트를 통하지 않고) 켤 수있는 프로그램을 작성하려는 노력에서 약간의 문제가 발생했습니다.

동사를 켤 수있는 알고리즘은 실제로 17 개 또는 17 개의 동사에 대해 상당히 단순하며 각 경우에 특정 패턴으로 실행됩니다. 따라서이 17 개의 클래스에 대한 접합 접미사는 정적이며 조만간 변경되지 않을 것입니다. 예를 들면 다음과 같습니다.

// Verbs #1 : (model: "chanter")
    terminations = {
        ind_imp: ["ais", "ais", "ait", "ions", "iez", "aient"],
        ind_pre: ["e", "es", "e", "ons", "ez", "ent"],
        ind_fut: ["erai", "eras", "era", "erons", "erez", "eront"],
        participle: ["é", "ant"]
    };

이것들은 프랑스어에서 가장 일반적인 동사 부류에 사용되는 접미사입니다.

동사의 다른 종류의 동사 (불규칙한 형태)가 있는데, 그 동사의 활용은 다음 세기 나 2 세기 동안 정적으로 유지 될 가능성이 매우 높다. 그것들은 불규칙적이기 때문에, 완전한 컨쥬 게이션은 정적으로 포함되어야한다. 그것들은 패턴으로부터 확실하게 결합 될 수 없기 때문이다 (또한 내 카운트에 의해 32 개의 불규칙 만이 존재한다). 예를 들면 다음과 같습니다.

// "être":
    forms = {
        ind_imp: ["étais", "étais", "était", "étions", "étiez", "étaient"],
        ind_pre: ["suis", "es", "est", "sommes", "êtes", "sont"],
        ind_fut: ["serai", "seras", "sera", "serons", "serez", "seront"],
        participle: ["été", "étant"]
    };

이 모든 것을 XML이나 JSON에 넣고 사용해야 할 때 직렬화를 해제 할 수는 있지만 요점이 있습니까? 이 줄은 자연어의 일부이며 변경되는 속도는 느립니다.

내 관심사는 “올바른”방식으로 작업하고 일부 데이터 소스를 역 직렬화 함으로써 복잡 하지 않아도 되는 문제를 복잡하게 만들었을뿐 아니라 알고리즘 접근 방식 : 데이터 소스를 사용 하지 않는 것! C #에서는 namespace Verb.Conjugation(예를 들어 class Irregular) 아래에 이러한 문자열을 XML로 채우고을 만드는 대신 열거 된 유형 또는 무언가로 저장할 클래스를 만들 수 있습니다 class IrregularVerbDeserializer.

질문 : 그럼 그것은 하드 코드 문자열에 적합한 매우 응용 프로그램의 수명 동안 변화 가능성? 물론 100 %가 변하지 않을 것이라고 보장 할 수 는 없지만 위험 대 비용은 거의 눈에 띄지 않습니다. 하드 코딩이 더 좋습니다.

편집 : 제안 된 복제본많은 수의 정적 문자열을 저장하는 방법을 묻지 만 제 질문은 언제 정적 문자열을 하드 코딩 해야하는지 입니다.



답변

응용 프로그램 수명 동안 변경되지 않는 문자열을 하드 코딩하는 것이 적절합니까? 물론 100 %가 변하지 않을 것이라고 보장 할 수는 없지만 위험 대 비용은 거의 눈에 무게를 tri 수 없습니다. 하드 코딩이 더 좋습니다.

당신이 당신의 자신의 질문에 대답 한 것으로 보입니다.

우리가 겪는 가장 큰 어려움 중 하나는 변하지 않는 물건과 변하지 않는 물건을 분리하는 것입니다. 어떤 사람들은 견딜 수 있고 구성 파일에 할 수있는 모든 것을 완전히 버립니다. 다른 사람들은 다른 극단으로 가서 가장 명백한 변화조차도 다시 컴파일해야합니다.

더 복잡하게 만드는 강력한 이유를 찾을 때까지 가장 쉬운 방법으로 구현했습니다.


답변

잘못된 범위를 추론하고 있습니다.

개별 동사 만 하드 코딩하지 않았습니다. 언어 와 해당 규칙 을 하드 코드했습니다 . 이는 애플리케이션을 다른 언어로 사용할 수 없으며 다른 규칙으로 확장 할 수 없음을 의미합니다.

이것이 당신의 의도라면 (즉, 프랑스어로만 사용), 이것은 YAGNI 때문에 올바른 접근법입니다. 그러나 나중에 다른 언어에서도 사용하고 싶다는 것을 인정합니다. 곧 곧 모든 하드 코딩 된 부분을 구성 파일로 이동해야합니다. 나머지 질문은 다음과 같습니다.

  • 가까운 시일 내에 100 %에 가까운 확실성으로 앱을 다른 언어로 확장 하시겠습니까? 그렇다면 앱의 주요 부분을 다시 작성하지 말고 JSON 또는 XML 파일 (단어, 단어의 일부 등) 및 동적 언어 (규칙의 경우)로 항목을 내 보내야합니다.

  • 또는 향후 어딘가에 앱이 확장 될 가능성은 아주 적습니다.이 경우 YAGNI는 가장 간단한 방법 (현재 사용중인 방법)이 더 낫다고 지시합니까?

예를 들어, Microsoft Word의 맞춤법 검사기를 사용하십시오. 하드 코딩 된 것으로 생각되는 것이 몇 개입니까?

텍스트 프로세서를 개발하는 경우 하드 코드 규칙 및 하드 코드 단어가 포함 된 간단한 맞춤법 엔진으로 시작할 수 if word == "musik": suggestSpelling("music");있습니다. 빠르게 단어를 옮기기 시작한 다음 코드 외부에서 스스로 규칙을 정하십시오. 그렇지 않으면:

  • 단어를 추가해야 할 때마다 다시 컴파일해야합니다.
  • 새로운 규칙을 배운 경우 소스 코드를 다시 한 번 변경해야합니다.
  • 더 중요한 것은 엄청난 양의 코드를 작성하지 않고 엔진을 독일어 나 일본어로 조정할 수있는 방법이 없다는 것입니다.

자신을 강조한대로 :

프랑스어 규칙은 일본어에 거의 적용되지 않습니다.

언어 규칙을 하드 코딩하는 즉시, 특히 자연 언어의 복잡성을 고려할 때 다른 언어마다 더 많은 코드가 필요합니다.

또 다른 주제는 코드를 통하지 않고 다른 규칙을 표현하는 방법입니다. 궁극적으로 프로그래밍 언어 가장 적합한 도구 라는 것을 알게 될 것 입니다. 이 경우 엔진을 다시 컴파일하지 않고 확장해야하는 경우 동적 언어 가 좋은 대안이 될 수 있습니다.


답변

값이 프로그램 논리와 독립적 으로 변경 될 수있는 경우 문자열을 구성 파일 또는 데이터베이스로 추출해야합니다 .

예를 들면 다음과 같습니다.

  • 리소스 파일로 UI 텍스트 추출 이를 통해 프로그래머가 아닌 사람이 텍스트를 편집하고 교정 할 수 있으며 지역화 된 새 리소스 파일을 추가하여 새 언어를 추가 할 수 있습니다.

  • 연결 문자열, 외부 서비스에 대한 URL 등을 구성 파일로 추출합니다. 이를 통해 서로 다른 환경에서 서로 다른 구성을 사용하고 응용 프로그램 외부의 이유로 변경해야 할 수 있으므로 구성을 즉시 변경할 수 있습니다.

  • 검사 할 단어 사전이있는 맞춤법 검사기. 프로그램 논리를 수정하지 않고 새로운 단어와 언어를 추가 할 수 있습니다.

그러나 구성으로 추출하면 복잡한 오버 헤드가 있으며 항상 의미가있는 것은 아닙니다.

프로그램 논리를 변경하지 않고 실제 문자열을 변경할 수없는 경우 문자열이 하드 코딩 될 수 있습니다 .

예 :

  • 프로그래밍 언어를위한 컴파일러. 각 키워드에는 컴파일러의 코드에서 지원해야하는 특정 의미가 있으므로 키워드는 구성으로 추출되지 않습니다. 새 키워드를 추가하면 항상 코드를 변경해야하므로 구성 파일로 문자열을 추출 할 때 아무런 가치가 없습니다.
  • 프로토콜 구현 : 예 : HTTP 클라이언트는 “GET”, “content-type”등과 같은 하드 코딩 된 문자열을 갖게됩니다. 여기서 문자열은 프로토콜 사양의 일부이므로 변경 가능성가장 적은 코드의 일부입니다 .

귀하의 경우에는 단어가 프로그램 논리의 통합 부분이라는 것이 분명하다고 생각합니다 (특정 단어에 대한 특정 규칙을 사용하여 활용기를 작성하기 때문에).이 단어를 외부 파일로 추출하는 것은 가치가 없습니다.

새 언어를 추가하면 각 언어마다 특정 활용 논리가 있으므로 새 코드를 추가해야합니다.


일부 사용자는 임의의 언어에 대한 컨쥬 게이션 규칙을 지정할 수있는 일종의 규칙 엔진 을 추가 할 수 있으므로 새로운 언어를 구성에 의해 순수하게 추가 할 수 있다고 제안했습니다. 인간 언어는 놀랍기 때문에 표현 규칙 엔진이 필요하기 때문에 그 길을 가기 전에 매우 신중하게 생각하십시오. 기본적으로 새로운 프로그래밍 언어 (공액 DSL)를 만들어 모호한 이익을 얻습니다. 그러나 필요한 것은 무엇이든 할 수있는 프로그래밍 언어가 이미 있습니다. 어쨌든 YAGNI.


답변

Dan Pichelman의 답변에 100 % 동의하지만 추가 할 것이 하나 있습니다. 여기서 스스로에게 물어야 할 질문은 “누가 단어 목록을 유지 / 확장 / 수정할 것입니까?”입니다. 항상 특정 언어 (특정 개발자, 나는 당신에게)의 규칙을 유지하는 사람이라면, 외부 구성 파일을 사용하는 것이 더 복잡하다면 아무런 이점이 없습니다. 이. 이러한 관점에서, 당신이 경우에도 같은 단어 목록을 하드 코딩 할 수 있도록 감각을 다할 것 때때로을 변경하는 것이 새 버전의 일환으로 새로운 목록을 제공하기에 충분 한,.

반면에 다른 사람이 나중에 목록을 유지할 수있는 기회가 약간 있거나 새 버전의 응용 프로그램을 배포하지 않고 단어 목록을 변경해야하는 경우 별도의 파일을 사용하십시오.


답변

하드 코딩 더 나은 동적 로딩 설정 파일보다 잘 여기 것, 그리고 동안에도, 나는 아직도 당신이 엄격 않는 것이 좋습니다 것입니다 분리 하여 데이터 로부터 (동사의 사전을) 알고리즘 . 빌드 프로세스에서 애플리케이션으로 바로 컴파일 할 수 있습니다.

이렇게하면 목록을 유지 관리하는 데 많은 어려움을 겪을 수 있습니다. VCS에서 커밋이 알고리즘을 변경했는지 또는 쉽게 컨쥬 게이션 버그를 수정했는지 여부를 쉽게 식별 할 수 있습니다. 또한 고려하지 않은 경우를 위해 목록을 추가해야 할 수도 있습니다. 특히, 계산 한 32 개의 불규칙 동사의 수가 정확하지 않은 것 같습니다. 그것들이 일반적으로 사용되는 것들을 다루는 것처럼 보이지만, 나는 그들 중 133 또는 350 에 대한 언급을 발견 했습니다.


답변

중요한 부분은 우려의 분리입니다. 이를 달성하는 방법은 관련성이 적습니다. 즉, Java는 괜찮습니다.

규칙이 표현되는 방식에 관계없이 규칙을 변경할 언어를 추가해야합니다. 얼마나 많은 코드와 파일을 편집해야합니까?

이상적으로는 ‘english.xml’파일을 추가하거나 새로운 ‘EnglishRules 구현 ILanguageRules’개체를 사용하여 새 언어를 추가 할 수 있어야합니다. 텍스트 파일 (JSON / XML)은 빌드 수명주기 외부에서 텍스트 파일을 변경하려는 경우 이점이 있지만 복잡한 문법, 구문 분석이 필요하며 디버그하기가 더 어려울 수 있습니다. 코드 파일 (자바)을 사용하면 복잡한 규칙을 더 간단하게 표현할 수 있지만 재구성이 필요합니다.

깨끗한 언어 불가지론 적 인터페이스 뒤에 간단한 Java API부터 시작하겠습니다. 두 경우 모두 필요합니다. 원하는 경우 나중에 XML 파일로 지원되는 해당 인터페이스의 구현을 언제든지 추가 할 수 있지만 해당 문제를 즉시 (또는 언제라도) 해결할 필요는 없습니다.


답변