코드와 데이터 분리는 어떻게 실습이 되었습니까?


29

질문을주의 깊게 읽어 보시기 바랍니다 :이 요청 하는 방법 이 아닌 이유 .

최근 에이 답변 을 보았습니다. 데이터베이스를 사용하여 변경 불가능한 데이터를 저장하는 것이 좋습니다.

그것은 당신이 묘사하는 많은 마법의 숫자, 특히 부분적으로 의존적 인 경우 실제로 코드가 아닌 데이터라고 생각합니다. [...] SQL 유형 데이터베이스를 의미하거나 단순히 형식화 된 텍스트 파일을 의미 할 수 있습니다.

프로그램이 수행하는 작업의 일부인 데이터가 있는 경우 프로그램 에 넣는 것이 좋습니다. 예를 들어, 프로그램의 기능이 모음을 세는 것이라면 vowels = "aeiou"그 안에 어떤 문제가 있습니까? 결국, 대부분의 언어에는 정확하게이 용도로 설계된 데이터 구조가 있습니다. 위에서 제안한 것처럼 "형식화 된 텍스트 파일"에 넣어서 데이터분리 하려고하는 이유는 무엇 입니까? 텍스트 파일을 원하는 프로그래밍 언어로 포맷하십시오. 이제 데이터베이스입니까? 아니면 코드입니까?

나는 이것이 멍청한 질문이라고 생각할 것이지만, 나는 진지하게 질문한다. 나는 "별도의 코드와 데이터"가 문화적으로 일종의 자명 한 진실로 떠오르고 있다고 생각합니다. 중요하지 않은 "

예를 들어,이 문서 : 꼭두각시 코드에서 데이터를 분리 할 때 발생하는 문제를 살펴보십시오 . 문제 ? 무슨 문제? Puppet 이 인프라를 설명하는 언어 인 경우 네임 서버가 8.8.8.8이라고 설명 할 수없는 이유는 무엇입니까? 문제는 코드와 데이터가 섞여있는 것이 아니라 1 그러나 Puppet에는 풍부한 데이터 구조와 다른 것들과의 인터페이스 방법이 부족하다는 것입니다.

이 변화가 혼란 스러워요. 객체 지향 프로그래밍은 "우리는 임의로 풍부한 데이터 구조를 원한다"고 말하면서 강력한 코드를 가진 데이터 구조를 부여했다. 결과적으로 캡슐화 및 추상화가 발생합니다. SQL 데이터베이스에도 저장 프로 시저가 있습니다. 코드에서 종양을 제거하는 것처럼 YAML 또는 텍스트 파일 또는 벙어리 데이터베이스에 데이터를 격리하면 모든 데이터가 손실됩니다.

누구든지 코드에서 데이터를 분리하는 이러한 관행이 어떻게 생겼으며 어디로 갈지 설명 할 수 있습니까? 누구든지 조명으로 출판물을 인용하거나 "데이터와 분리 된 코드"를 새로운 계명으로 설명하고 그 기원을 보여주는 관련 데이터를 제공 할 수 있습니까?

1 : 그런 구별을 할 수 있다면. 당신을보고 있습니다, Lisp 프로그래머


5
원하는 언어로 모든 HTML 및 CSS를 묻습니다.
JeffO

3
나는 인용의 저자가 의미하는 것은 마법의 숫자가 실제로 불변이 아니라는 것입니다.
Pieter B

4
모음을 하드 코딩하는 데 아무런 문제가 없습니다. 응용 프로그램이 모음을 영어로 계산하는 데만 사용되는 경우.
Michael Paulukonis

3
코드와 데이터를 분리하는 큰 기술적 이유는 데이터가 변경 될 때 코드를 다시 컴파일 할 필요가 없기 때문입니다. 따라서 스크립팅 언어와 같은 정도로 적용되는지 질문합니다.
user16764

1
@ MichaelPaulukonis : 데이터베이스에 넣는 것은 가짜 해결책입니다. 네덜란드어에 필요한 변경 사항이 있습니까? 제로 (DB 변경조차도 아님). 프랑스어 / 독일어에 필요한 변경 사항이 있습니까? 최소한 ISO-8859-1 지원. (DB 이상). 그리스어 / 러시아어에 필요한 변경 사항이 있습니까? 유니 코드 지원 (DB 이상) 사실, 그 DB가 도움이되는 언어는 생각할 수 없습니다.
MSalters

답변:


22

데이터를 코드와 분리해야하는 많은 이유가 있으며, 그렇지 않은 이유가 있습니다. 다음이 생각납니다.

적시. 데이터 가치는 언제 알려 집니까? 코드 작성 시점, 컴파일, 링크, 릴리스, 라이센스, 구성, 실행 시작 또는 실행 중일 때입니까? 예를 들어, 일주일의 일수 (7)는 일찍 알려져 있지만, USD / AUD 환율은 상당히 늦게 알려질 것입니다.

구조. 이것은 단일 고려 사항에 따라 설정된 단일 데이터 시간입니까, 아니면 더 큰 항목 모음의 상속 또는 일부일 수 있습니까? YAML 및 JSON과 같은 언어를 사용하면 여러 소스의 가치를 결합 할 수 있습니다. 초기에 불변 인 것으로 보이는 일부 항목은 구성 관리자의 특성으로보다 쉽게 ​​액세스 할 수 있습니다.

소재지. 모든 데이터 항목이 제한된 수의 장소에 저장되어있는 경우, 특히 일부는 새로운 (불변) 값으로 변경해야하는 경우 관리하기가 훨씬 쉽습니다. 데이터 값만 변경하기 위해 소스 코드를 편집하면 의도하지 않은 변경 및 버그가 발생할 위험이 있습니다.

우려의 분리. 알고리즘이 올바르게 작동하도록하는 것은 사용할 데이터 값을 고려하는 것이 가장 좋습니다. 알고리즘이 아닌 알고리즘을 테스트하려면 데이터가 필요합니다. http://c2.com/cgi/wiki?ZeroOneInfinityRule 도 참조 하십시오 .

귀하의 질문에 대한 답변으로 이것은 새로운 것이 아닙니다. 핵심 원칙은 30 년 이상 변하지 않았으며 그 동안 반복해서 쓰여졌습니다. 나는 일반적으로 논란의 여지가 없으며 새로운 초보자에게 설명할만한 주제로 주제에 대한 주요 출판물을 기억할 수 없습니다. 여기에 조금 더 있습니다 : http://c2.com/cgi/wiki?SeparationOfDataAndCode .

내 개인적인 경험은 특정 소프트웨어에서 이러한 분리의 중요성이 시간이 지남에 따라 점점 커지는 것입니다. 하드 코딩 된 값은 헤더 파일로 이동하고 컴파일 된 값은 구성 파일로 이동하며 단순 값은 계층 구조 및 관리 구조의 일부가됩니다.

트렌드에 관해서는 (10 년 이상) 전문 프로그래머들 사이에서 태도에 큰 변화가 없었지만, 업계는 점점 더 젊은이들로 가득 차 있으며, 내가 생각하고 결정한 많은 것들이 때때로 도전과 재창조로 이어지고 있습니다. 통찰력이지만 때로는 무지합니다.


2
이 연습의 역사와 추세를 확장 할 수 있습니까? 모두가 이러한 고려를했다면 나는 그 질문을하지 않았을 것입니다. 문제의 전제는 사람들이 자신의 데이터가 어디로 가야하는지 (컴파일 된 상수, 외부 데이터베이스, YAML ...) 신중하게 고려하지 않고 오히려 "코드 및 데이터 혼합 불량! HULK SMASH!" 왜 또는 언제 이런 일이 되었습니까?
Phil Frost

그것은 내 경험의 일부가 아니므로 말할 수 없습니다. 내 답변에 몇 가지 매개 변수를 추가했습니다.
david.pfx 2013

나는 "청소년의 유출"이 타당한 설명이라고 생각하지만, 나는이 젊은이들로부터 아이디어를 어디서 얻었는지 듣고 싶어서 받아들이고 있습니다. 분명히 그들은 "별도의 코드와 데이터"부분을 얻었지만 나머지는 얻지 못했다고 생각합니다. 그들은 블로그 게시물에서 읽었습니까? 책? 언제 어디서?
Phil Frost

당신은 항상 "_____ BAD! HULK SMASH!" 그렇다고해서 사실이 아닙니다. 종종 이런 종류의 것 (예 : " 'GOTO'BAD! HULK SMASH!")은 초보자들에게 왜, 또는 예외가 무엇인지 가르쳐주지 않고 초보자에게 가르쳐집니다.
AMADANON Inc.

Locality우리는 서로 다른 클라이언트에 대한 사용자 정의 요구 사항으로 인해 일종의 플러그인 유형 시스템으로 끝났으며 수년간의 시행 착오를 통해 상수 (예 : 표 목록으로 표를 표시)를 유지하는 방법을 배웠습니다. 데이터베이스와 코드에서 둘 다 "플러그인"이외의 위치에서 사용하는 것이 올바르지 않으며 변경이 발생할 때 변경 사항이 자동으로 버전 화되기 때문입니다.
이즈 카타

8

데이터가 훨씬 확장되고 코드와 분리 될 때 훨씬 쉽게 쿼리하고 수정할 수 있습니다. 데이터가 자연 스럽더라도 (예를 들어, 데이터는 규칙 또는 명령을 나타냄) 데이터를 코드를 구조화 된 데이터로 저장할 수 있으면 별도로 저장하는 이점을 누릴 수 있습니다.

권한

데이터가 하드 코딩 된 경우 해당 데이터를 편집하려면 소스 파일을 편집해야합니다. 이는 다음 중 하나를 의미합니다.

  • 개발자 만 데이터를 편집 할 수 있습니다. 데이터 입력은 개발자의 기술과 지식이 필요한 것이 아닙니다.

  • 비 개발자는 소스 파일을 편집 할 수 있습니다. 이것은 나쁘다-소스 파일을 모르더라도 망칠 수있다!

  • 데이터는 별도의 소스 파일로 하드 코딩되어 있으며 개발자가 아닌 사용자는 해당 파일에만 액세스 할 수 있습니다. 그러나 이것은 실제로 계산되지 않습니다. 이제 데이터가 코드와 분리되어 자체 파일에 저장됩니다 ...

편집

따라서 누가 데이터를 편집 할 수 있는지 에 대해서는 별도로 저장하는 것이 가장 좋습니다. 방법에 대한 방법 들이 데이터를 편집 할 수 있습니다? 많은 양의 데이터가있는 경우 직접 입력하면 번거롭고 오류가 발생합니다. 이것에 대한 UI를 갖는 것이 훨씬 좋습니다! 여전히 모든 것을 입력해야하더라도 형식의 보일러 플레이트를 입력하지 않아도되므로 형식을 엉망으로 만들고 전체 파일을 망칠 가능성이 줄어 듭니다!

데이터가 하드 코딩 된 경우 해당 UI를 작성하면 자동화 된 도구가 직접 작성한 소스 파일을 편집하게됩니다. 자동화 도구가 소스 파일을 열고 데이터의 위치를 ​​찾은 다음 해당 코드를 수정하려고 시도합니다. Brrr ... Microsoft는 이러한 것들을 피하기 위해 C #에 부분 클래스를 도입했습니다 ...

데이터가 분리 된 경우 자동화 된 도구는 데이터 파일 만 편집하면됩니다. 차라리 요즘 데이터 파일을 편집하는 컴퓨터 프로그램은 그렇게 드문 일이 아니라고 생각합니다 ...

스케일링

코드와 데이터는 매우 다르게 확장됩니다. 코드가 커짐에 따라 더 많은 클래스와 메서드 (또는 데이터 구조 및 함수)로 분리하려고하지만 데이터가 아무리 커도 관계없이 한 곳에 유지하려고합니다. 파일을 여러 파일로 분리해야하는 경우에도 해당 파일을 어떻게 든 함께 묶기를 원하므로 코드에서 해당 데이터에 더 쉽게 액세스 할 수 있습니다.

따라서 소스 파일 내에 수천 줄의 데이터가 있다고 가정하십시오. 컴파일러 / 인터프리터는 파일을 읽을 때마다 모든 데이터를 거쳐야하며 비싼 특정 어휘 분석기 및 파서로 파싱해야합니다.이 특정 프로그램 실행에서 해당 데이터에 액세스하지 않더라도 말입니다. 또한 해당 파일에서 실제 코드를 편집 할 때 전체 프로세스를 복잡하게하는 데이터를 이동해야합니다. 또한 데이터 파일을 색인 할 수 있습니다. 하드 코딩 된 데이터? 별로 ...

수색

많은 양의 데이터가 있습니다. 검색하는 것이 자연 스럽습니다.

  • 데이터베이스에 저장하면 데이터베이스 쿼리 언어를 사용할 수 있습니다.

  • XML 파일로 저장하면 XPath를 사용할 수 있습니다.

  • JSON / YAML에 저장하면 선호하는 스크립팅 언어의 REPL에로드하여 검색 할 수 있습니다.

  • 일반 텍스트 파일로 저장하더라도 프로그램이 인식 할 수있는 구조를 가지고 있기 때문에 grep / sed / awk를 사용하여 검색 할 수 있습니다.

소스 파일에서 하드 코딩 된 데이터를 통해 grep / sed / awk를 grep / sed / awk 할 수도 있지만 쿼리가 관련되지 않은 다른 행과 일치하거나 다르게 작성된 행을 놓칠 수 있기 때문에 제대로 작동하지 않습니다. 프로그래밍 언어의 데이터 표현 구문이 허용합니다.

코드를 검색하는 도구가 있지만 하드 코딩 된 데이터가 아닌 선언을 찾는 데 유용합니다.

그 말은 ...

데이터와 코드를 구별하는 것이 매우 중요합니다. 코드로 작성된 것이 데이터가 될 수 없다는 의미는 아닙니다. 그리고 데이터 표현으로 작성된 것이 실제로 코드가 아니라는 것을 의미하지는 않습니다.

"매직 숫자"에 대해 매우 엄격한 규칙을 강의했을 때 수업이있었습니다. 코드에 숫자가 없었습니다. 즉, 다음과 같은 작업을 수행해야합니다.

#define THE_NUMBER_ZERO 0
//....
for(int i=THE_NUMBER_ZERO;i<cout;++i){
//....

그건 우스운 일입니다! 예, 0기술적으로는 "데이터"이지만, for루프 의 나머지 부분과 마찬가지로 코드의 일부입니다 ! 우리가 비록 수있는 데이터로 표현하고 코드에서 분리, 그것은 우리가 의미하지 않는다 해야한다 . 우리는 코드 안에 데이터를 남기고 싶지 않기 때문에 실제로 데이터가 아니기 때문에 나머지 코드보다 많지 않으며 1과 0으로 컴파일됩니다 ...


7

혼란이 계속되고 있다고 생각합니다. "코드와 데이터 분리"와 "프로그램의 동작을 데이터로 표현"이라는 두 가지를 함께 혼합하고 있습니다.

귀하의 경우 실제로 두 번째가 걱정되고 첫 번째 것이 혼합되는 것이 걱정됩니다. 프로그램의 동작을 데이터로 표현하면 쉽게 확장 할 수 있습니다. 의 예에서 vowels = "aeiou"새 모음을 추가하는 것은 문자를 추가하는 것만 큼 간단합니다. 이 데이터가 외부에있는 경우 프로그램을 다시 컴파일하지 않고도이 동작을 변경할 수 있습니다.

그리고 당신이 그것에 대해 생각할 때, OOP는이 생각의 확장입니다. 데이터와 동작을 함께 바인딩하면 프로그램의 데이터를 기반으로 프로그램의 동작을 변경할 수 있습니다.


2
자연스럽게 모음 목록이 변경됩니다.
cHao

13
@cHao i18n이 시작 되 자마자 시작됩니다 .
Reinstate Monica

2
i18n은 당신의 머리를 깨뜨릴 수 있습니다 -javaspecialists.eu/archive/Issue209.html
Rory Hunter

2
@ Angew : i18n이 들어서 자마자 당신은 망가졌습니다 . 이를 위해서는 코드가 필요합니다. 순진한 솔루션은 모든 경우를 영어로 처리 할 수 ​​없습니다. (잠시 잊어라 ï; 이야기 y하고 이야기하자 w!) 데이터베이스로 목록을 옮기는 것은 그것을 고칠 것이 아니며 실제로는 해롭다-잘못하면 복잡하지 않지만 복잡하지는 않다. i18n을 처음부터 설계하지 않는 한 "잘못된" 것이 무엇인지 아십시오 . 어느 시점에서 당신은 모음 목록이 그것을 잘라 내지 않을 것이라는 것을 이미 알고 있습니다.
cHao

1
@ BenLee : 실제로 조금 놀라지 않을 것입니다. 나는 현재 우리가 말하는 것과 같은 코드를 변경하기 위해 노력하고 있습니다. 그러나 데이터베이스에 모든 것을 아웃소싱하는 것은 완전히 다른 종류의 운세입니다. 무언가 수정이 필요한지 여부를 모르는 경우, 더 중요한 것은 수정 방법을 아직 모른다면 IMO를 추가하기 전에 유연성이 필요할 때까지 기다리는 것이 좋습니다. .
cHao

5

예를 들어, 프로그램의 기능이 모음을 세는 것이라면 모음에 "aeiou"가 있으면 무엇이 잘못 되었습니까?

구성을 외부에 저장하면 많은 구성에서 작동 할 것으로 예상되는 하나의 코드 버전을 가질 수 있습니다. 대안은 구성에 따라 다른 많은 버전의 소프트웨어를 유지 관리하는 것입니다.

vowels = "aeiou"를 언급하는데, 때때로 "y"를 원한다면 전체 프로그램을 다시 만들어야합니까? 코드를 수정 했으므로 이제 버전을 쉽게 업그레이드 할 수 있습니까? 오류가 발생하면 원인이됩니까, 아니면 프로그램이 손상 되었습니까?

프로그램 내부에있는 경우 프로그램에서 사용자가 가능한 부작용을보기 위해 코드를 스캔하지 않고 모음의 정의를 변경하지 않을 것을 암시합니다. 정의가 외부에 저장되어 있으면 프로그램이 구성에 설정된 적절한 값을 초과하지 않아야 함을 의미합니다.

코드에서 종양을 제거하는 것처럼 YAML 또는 텍스트 파일 또는 벙어리 데이터베이스로 데이터를 격리 할 때

일부는, 당신은 당신의 소중한 데이터에서 코드의 종양을 제거하는 것입니다 반대,으로 볼 참조 : 좋은 프로그래머에 대한 토발즈의 견적


4
Torvalds 따옴표는 데이터가 아닌 데이터 구조를 나타냅니다.
user949300 2019

OP는 "객체 지향 프로그래밍은"자유롭게 풍부한 데이터 구조를 원한다 "며, 코드의 힘을 가진 데이터 구조를 부여했다"고 말했다.
FMJaguar

1
모음의 정의를 근본적으로 변경하면 모든 자동 테스트를 다시 실행해야합니다. 배치 된 시스템에서 구성 파일이 변경 될 때 테스트를 다시 실행할 수있는 능력이 거의없는 시스템. 따라서 이러한 정의는 시스템에 내장되어야합니다. 구성 옵션이있는 두 개의 하드 코딩 된 세트 중 하나 일 수 있습니다.
soru

토발즈의 인용문 +1 나는이 감정에 동의한다. 꼭두각시의 예에서, 문제는 꼭두각시가 사람들이 그것에 넣고 싶어하는 정보를 표현하기에 좋은 데이터 구조를 가지고 있지 않다고 생각한다. 꼭두각시 개발자는 데이터 구조를 수정하는 대신 "코드의 데이터"가 문제 (이유는 무엇입니까?)라고 주장하고 hiera를 개발 했습니다. 행동을 데이터와 연결합니다.
Phil Frost

2

나는 리드가 참조 데이터를 작은 테이블에 넣기를 고집 한 한 프로젝트에 있었고 어리석은 것으로 생각했습니다. 그러나 우리는 이미 지속성 인프라와 연결성을 설정 했으므로 다른 지속성 작업에 비해 비용이 매우 저렴했습니다.

지금, 나는 여전히 이것이 어리석은 결정이라고 생각합니다. 만약 우리 인프라를 가지고 있지 않다면 , 아직하지 않았을 것입니다.

그러나 내가 보는 찬성론 중 일부는 다음과 같습니다.

  • 데이터베이스 마인드가있는 경우 참조 데이터를 SQL 데이터베이스에 넣으면보고를 위해이를 결합 할 수 있습니다.
  • 관리 유틸리티가 있거나 데이터베이스에 액세스하는 경우 런타임시 값을 조정할 수 있습니다. (불을 가지고 놀 수는 있지만)

또한 정책이 코딩 관행을 방해하는 경우도 있습니다. 예를 들어 .xml 파일을 푸시하는 것이 A-OK 인 여러 상점에서 근무했지만 코드의 줄을 만지면 전체 회귀주기가 필요하고 부하 테스트가 필요할 수 있습니다. 그래서 프로젝트에 대한 .xml 파일이 매우 풍부한 곳에 한 팀이있었습니다 (어쩌면 -heh-가 코드를 포함했을 수도 있습니다).

텍스트 파일 일지라도 코드에서 외부 데이터 저장소로 데이터를 푸시 할 때 얻을 수있는 이점을 누릴 수 있는지 항상 자문 해 보았습니다. 충동.


3
XML 편집이 "정상"이지만 코드에서 동일한 것을 편집하는 것은 상점 절차에 대한 좋은 의견입니다.
user949300

모든 것이 데이터베이스에있을 수있는 한 상점에서 화면 텍스트까지 작동했습니다. 사용자 인터페이스 코드 외에, 데이터베이스에없는 유일한 것은 데이터베이스 위치와 자격 증명입니다.
jwenting

3
언젠가 누군가가 "이를 요구하는 사용자 X를 위해 이것을 재구성 할 수 있을까?"라고 물을 때까지 항상 바보처럼 들린다. Damn customers :)
gbjbaanb

2
... 그리고 그 날이 "never"라면 어리석은 느낌이 듭니다
Rob

2

완전히 진지한 반대 질문을하겠습니다. "데이터"와 "코드"의 차이점은 무엇입니까?

"data"라는 단어가 들리면 "state"라고 생각합니다. 정의에 따르면 데이터는 응용 프로그램 자체가 관리하도록 설계된 것이므로 컴파일 타임에 응용 프로그램이 알 수없는 것입니다. 그것은하지 않습니다 없는 데이터 - 때문에 곧, 그것은 행동이된다 당신이 하드 코드로 하드 코드 데이터.

데이터 유형은 응용 프로그램에 따라 다릅니다. 상업용 송장 시스템은 고객 및 주문 정보를 SQL 데이터베이스에 저장할 수 있으며 벡터 그래픽 프로그램은 형상 데이터 및 메타 데이터를 이진 파일에 저장할 수 있습니다. 이 두 경우와 그 사이의 모든 상황에서 코드와 데이터가 명확하고 깨지지 않습니다. 데이터는 프로그래머가 아닌 사용자 에게 속하므로 하드 코딩 할 수 없습니다.

당신이 말하고있는 것은 나의 현재 어휘에서 사용 가능한 가장 기술적으로 정확한 설명을 사용하는 것입니다 : 대부분의 응용 프로그램을 개발하는 데 사용되는 기본 프로그래밍 언어로 작성되지 않은 프로그램 동작을 통제하는 정보.

"data"라는 단어보다 애매 모호한이 정의조차도 몇 가지 문제가 있습니다. 예를 들어, 프로그램의 중요한 부분이 각각 다른 언어로 작성된 경우 어떻게됩니까? 저는 개인적으로 약 50 % C # 및 50 % JavaScript 인 여러 프로젝트를 수행했습니다. JavaScript 코드는 "데이터"입니까? 대부분의 사람들은 거절합니다. HTML은 어떻습니까? "데이터"입니까? 대부분의 사람들은 여전히 ​​거절합니다.

CSS는 어떻습니까? 그 데이터 또는 코드입니까? 코드를 프로그램 동작을 제어하는 ​​것으로 생각하면 CSS는 실제로 코드가 아닙니다. 왜냐하면 CSS는 동작이 아니라 모양에만 영향을 미치기 때문입니다. 그러나 실제로 데이터도 아닙니다. 사용자는 그것을 소유하지 않으며, 응용 프로그램은 그것을 소유하지도 않습니다. UI 디자이너의 코드와 동일합니다. 코드 와 비슷 하지만 코드 아닙니다.

CSS를 일종의 구성이라고 부를 수 있지만 좀 더 실용적인 정의는 단순히 도메인 특정 언어로 코드화된다는 것입니다 . XML, YAML 및 기타 "형식화 된 파일"이 종종 나타내는 것입니다. 또한 도메인 별 언어를 사용하는 이유는 일반적으로 C 또는 C # 또는 Java와 같은 범용 프로그래밍 언어로 동일한 정보를 코딩하는 것보다 특정 도메인에서 동시에 더 간결하고 표현력이 뛰어 나기 때문입니다.

다음 형식을 인식합니까?

{
    name: 'Jane Doe',
    age: 27,
    interests: ['cats', 'shoes']
}

나는 대부분의 사람들이 그렇게 확신합니다. 그건 JSON . JSON에 대한 흥미로운 점은 다음과 같습니다. JavaScript에서는 코드 가 명확 하고 다른 모든 언어에서는 데이터 형식 이 명확 합니다. 거의 모든 주류 프로그래밍 언어에는 JSON "구문 분석"을위한 라이브러리가 하나 이상 있습니다.

JavaScript 파일의 함수 내에서 똑같은 구문을 사용하면 코드 이외의 다른 것이 될 수 없습니다. 그러나 JSON을 가져 와서 .json파일로 가져 와서 Java 애플리케이션에서 구문 분석하면 갑자기 "데이터"입니다. 정말 말이 되나요?

나는 "데이터-성"또는 "구성-성"또는 "코드-성"이 기술 된 방식 이 아니라 기술 된 것에 고유 한 것이라고 주장한다 .

임의의 암호를 생성하기 위해 프로그램에 백만 단어의 사전이 필요한 경우 다음과 같이 코드를 작성 하시겠습니까?

var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");

아니면 모든 단어를 줄로 구분 된 텍스트 파일로 넣고 프로그램에서 읽도록 지시합니까? 단어 목록이 절대 바뀌지 않는 것은 중요하지 않습니다. 하드 코딩인지 소프트 코딩인지 (많은 사람들이 부적절하게 적용 할 때 반 패턴으로 간주되는) 문제인지는 문제가되지 않습니다. 어떤 형식이 가장 효율적이며 "물건"이 무엇이든 "물건"을 설명하기가 가장 쉽습니다. 코드 또는 데이터라고 부르는 것은 상당히 관련이 없습니다. 프로그램 실행에 필요한 정보이며 플랫 파일 형식이 가장 편리하게 관리하고 유지 관리하는 방법입니다.

적절한 관행을 따르고 있다고 가정하면,이 모든 것이 어쨌든 소스 제어에 들어가므로, 코드를 호출 할 수도 있습니다. 또는 구성이라고 할 수 있지만 구성과 코드를 구별하는 유일한 방법은 코드를 문서화하고 최종 사용자에게 변경 방법을 알려주는 것입니다. 컴파일 타임이 아닌 시작 시간이나 런타임에 구성이 해석되는 것에 대한 가짜 주장을 발명 할 수는 있지만 동적으로 유형이 지정된 여러 언어와 그 안에 스크립트 엔진이 내장 된 거의 모든 것을 설명하기 시작합니다 (예 : 대부분의 게임). 코드와 구성은 더 이상 아무것도 아닌 것으로 라벨을 붙이기로 결정한 모든 것입니다.

이제이 있습니다 에 위험 외부화 실제로 수정하는 것이 안전하지 않습니다 정보 (위의 "소프트 코딩"링크를 참조). 모음 파일을 구성 파일로 외부화하고이를 최종 사용자에게 구성 파일로 문서화하는 경우, "q"를 모음으로 지정하여 앱을 즉시 중단 할 수있는 거의 완벽한 방법을 제공합니다. 그러나 이것이 "코드와 데이터의 분리"의 근본적인 문제는 아니며 단순히 디자인 감각이 나쁘다는 것입니다.

주니어 개발자들에게 환경에 따라 변경 될 것으로 예상되는 설정을 항상 외부화해야한다는 것입니다. 여기에는 연결 문자열, 사용자 이름, API 키, 디렉토리 경로 등이 포함됩니다. 그들은 당신의 dev 상자와 프로덕션에서 동일 할 수도 있지만 아마도 아닐 수도 있습니다 .sysadmins는 dev가 아닌 프로덕션에서 어떻게 보일지 결정할 것입니다. 따라서 일부 컴퓨터에는 하나의 설정 그룹을 적용하고 다른 컴퓨터에는 다른 설정을 적용 할 수있는 방법이 필요합니다 (ergo, 외부 구성 파일 (또는 데이터베이스의 설정 등)).

그러나 단순히 "데이터"를 "파일"에 넣는 것은 구성으로 외부화하는 것과 같지 않다고 강조합니다. 단어 사전을 텍스트 파일에 넣었다고해서 사용자 (또는 IT)가 변경하기 를 원한다는 의미는 아닙니다. 개발자 가 지옥에서 무슨 일이 일어나고 있는지 이해하고 필요한 경우 더 쉽게 이해할 수 있도록하는 방법 일뿐입니다. 가끔 변경됩니다. 마찬가지로, 테이블이 읽기 전용이고 DBA가 절대로 나사를 쓰지 말라고 지시 한 경우, 데이터베이스 테이블에 동일한 정보를 넣는 것이 반드시 행동의 외부화로 간주되지는 않습니다. 구성은 데이터가 변경 가능하지만 실제로는 형식 선택이 아닌 프로세스 및 책임에 의해 결정됨을 의미합니다.

요약하면 다음과 같습니다.

  • "코드"는 엄격하게 정의 된 용어가 아닙니다. 정의를 확장하여 도메인 별 언어 및 동작에 영향을 미치는 다른 요소를 포함 시키면 이러한 명백한 마찰이 사라지고 모든 것이 의미가 있습니다. 플랫 파일에 컴파일되지 않은 DSL "코드"가있을 수 있습니다.

  • "데이터"는 사용자 나 개발자 이외의 다른 사람이 소유하고 일반적으로 디자인 타임에 사용할 수없는 정보를 의미합니다. 원하는 경우에도 하드 코딩 할 수 없습니다. 자체 수정 코드를 제외하고 코드와 데이터를 구분하는 것은 개인적인 취향이 아니라 정의의 문제입니다.

  • "소프트 코딩"은 과도하게 적용되는 경우 끔찍한 관행 일 수 있지만 모든 외부화 인스턴스가 반드시 소프트 코딩을 구성하는 것은 아니며 "플랫 파일"에 정보를 저장하는 많은 인스턴스가 반드시 외부화의 선의의 시도는 아닙니다.

  • 구성은 소프트 코딩 즉의 특별한 유형 입니다 때문에 응용 프로그램이 다른 환경에서 실행해야 할 수도있는 지식이 필요. 응용 프로그램과 함께 별도의 구성 파일을 배포하면 모든 환경에 다른 버전의 코드를 배포하는 것보다 작업이 훨씬 적고 덜 위험합니다. 따라서 일부 유형의 소프트 코딩이 실제로 유용합니다.


1

Oren Eini (일명 Ayende Rahien)의이 고전 기사를 읽는 것이 좋습니다.

http://ayende.com/blog/3545/enabling-change-by-hard-coding-everything-the-smart-way

내 자신의 테이크 아웃은 단순성과 가독성에 중점을 둡니다. 이는 재구성이 불가능한 것이 하드 코딩 된 상태 (가독성)로 유지되는 것이 가장 좋습니다. 이를 통해 프로그래밍 언어의 전체 구문을 사용하여 매개 변수를 표현할 수있을뿐만 아니라 코드 완성 및 오용시 컴파일러 오류와 같은 유익한 부작용을 얻을 수 있습니다.

이 방법을 사용하면 구문 분석 / 해석의 복잡성을 피할 수 있습니다 ( "다른 사람이 내 YAML / JSON을 구문 분석합니다"-구문 분석 된 텍스트를 특정 API 호출에 맵핑하는 것은 해석의 한 형태 일 수 있음). "와 그 사용.

어떤 경우에는 다음과 같은 시나리오에서도 데이터로 표현되기도합니다. 예를 들어, 3D 공간에서 수천 점을 지정하는 것이 코드보다 텍스트 파일에 더 적합 할 수 있습니다. 그것조차도 적절할 수 있습니다.


1

좋아, 여가를 위해 어떤 종류의 C ++ 프로그램을 작성하고 싶다고 가정 해 봅시다. 해야 할 일과하지 않아도 될 일을 정확히 알고 있습니다. 이제 "현대 소프트웨어 디자인"에 관한 책을 가져 가십시오. 게임의 규칙은 다음과 같습니다. 프로젝트의 모든 클래스와 아주 작은 경우마다 코드를 "깨끗한 디자인"으로 만들기 위해 해당 책에서 설명한 모든 멋진 패턴을 구현해야합니다. 글쎄, "의존성 주입"은 많은 ppl에 충분할 것입니다. (이것은 자바가 아닌 c ++입니다!) 프로그래밍은 점점 더 이론적 인 관점에서 배웁니다. 작업을 완료하는 것만으로는 충분하지 않으며 유지 보수가 가능한 코드를 작성해야합니다. ppl 때 문제가 시작됩니다. 실제 이유에 대한 생각을 멈추고 디자인 패턴이 발명되어 독단적이되었습니다.

하나의 간단한 설계 원칙을 사용하여 문자 카운팅 도구 작성을 중단하겠습니다. 특정 유형의 입력 데이터에서 특정 작업을 수행하는 코드를 작성할 때 주어진 입력에 대해 해당 작업을 수행 할 수 있는지 확인하십시오 해당 유형의 데이터. -문자 countig 도구를 작성하려면 모음뿐만 아니라 "모든 문자"를 계산할 수있는 방식으로 작성하는 것이 좋습니다. -구문 분석중인 모음이 실제로 무엇인지 알지 못할 수 있으므로 매우 일반적인 인코딩 (UTF-16)을 선택하고 대부분의 (모두?) 작성된 언어 및 기호를 포함 할 수 있습니다.

그 시점까지 우리는 두 개의 인수 (모집과 계산할 문자)가있는 함수가 있습니다. 우리는 글자가 속하는 합리적으로 일반적인 "유형"또는 "클래스"를 찾는 것에 관심이 있습니다. ASCII 기호보다 더 잘 할 수 있습니다!

"일반화 및 재사용 성"-교리를 사용하는 악마를 입력하십시오.-왜 해당 클래스의 입력 스트림에서 클래스의 심볼을 계산하지 않습니까? (문자에서 임의의 그러나 유한 한 길이의 비트 시퀀스까지 컴퓨터에서 얻을 수있는 가장 일반적인 것입니다 ...)-잠깐만, 그래도 여전히 자연수로 계산됩니다. 그러나 계산은 계산 가능한 세트에서 공리를 충족시키는 자체로의 매핑으로 일반화 될 수 있습니다 ... [당신은 아이디어를 얻습니다]

이 예제는 어리석은 것이지만, 계산 도구보다 복잡한 설계 작업을 고려하면 책에서 찾은 일종의 설계 패턴에 따라 필요한 추가 추상화를 도입 할 수 있습니다.

"데이터"와 "코드"의 분리는 아마도 사소한 것 (함수 인수)이거나 변하지 않는 변수를 변수 ( "데이터")로 취급한다는 것을 알게 될 것입니다.

혼동이있는 경우 "인터페이스"및 "서비스"및 모든 클래스 특정 (예 : 유형)이 갑자기 "데이터"가 될 가능성이 있습니다. 이는 외부에서 주입되는 종속성입니다. 대학에서 가르치는 정보학 과정이 철학 강의와 비슷 해졌고 학생들이 소프트웨어를 만드는 방법을 경험할 수 있도록 실제 프로젝트 시간이 줄었다 고 생각합니다. 왜 명백한 해결책 대신에 미묘하게 복잡한 패턴을 사용해야하는지 궁금하다면,이 개발은 그 요구가 어떻게 만들어 졌는지 (아마도) ...

특정 문제에 대해 : 1.) 특정 사례에 대해 최대 하드 코딩을 사용하여 프로그램을 작성한 다음 2) 예를 들어 해당 코드에서 곧바로 일반화하십시오. 더 많은 함수 인수를 도입하고 다른 "사소한 패턴"을 사용하면 함수형 프로그래밍이 발명 된 이후로 이루어진 것처럼 확실한 방법으로 코드와 데이터를 분리 할 수 ​​있습니다. (때로는 1을 건너 뛰고 2를 즉시 수행하십시오 ...)

여기에 분명하지 않은 것은 "이론 교착 상태"의 경우 일 수 있습니다. 인터페이스와 다른 인터페이스를 참조하는 인터페이스를 작성하는 것과 같이 ... 결국 모든 인터페이스를 구성하기 위해 깔끔한 작은 xml 파일이 있습니다. 클래스 인터페이스 클러 터에 주입 할 종속성.

희망하는 xml 파서가 작동하기 위해 xml 구성이 필요하지 않기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.