DaehunGwak / study-pragmatic-programmer

실용주의 프로그래머 (20주년 판) 스터디
5 stars 1 forks source link

6주차 - 2.14 도메인 언어 #12

Open DaehunGwak opened 1 year ago

DaehunGwak commented 1 year ago

진도

2.14 도메인 언어

일시

minkukjo commented 1 year ago

끄적끄적

도전해볼 것

궁금한 점

연습 문제 4

fun operate(command: String, option: Int?) {
    when(command):
           "P":
                  val number = option?: processException()
                   Picker.select(number)
           "D":
           "W":
           "N":
           "....":
}

연습문제 5

그냥 함수로 짜면 되는데 귀찮아서 패스..

연습문제 6

BNF 문법이 무엇인고 하고 찾아봤더니, 신택스 트리를 구문화 해놓은 것으로 이해했다.

결국 시간 단위에 대한 BNF 표기법이 필요하다는 뜻으로 이해를 했고 답지를 봐서 이해했다 -_-;

연습문제 7

패스

연습문제 8

패스

DaehunGwak commented 1 year ago

언어의 한계가 곧 자기 세계의 한계다 - 루트비히 비트겐슈타인

  • Tip 22. 문제 도메인에 가깝게 프로그래밍하라.
  • 도메인 : 문제를 해결 하기 위한 영역
  • 큐컴버는 행동 기반 테스트 코드이긴 하지만 결국 코드… 사업부에서 안봄
  • 최대한 동작하는걸 보여줘야 함
  • 도메인 언어의 특성
  • 내부 도메인: 랭귀지 종속적
  • 외부 도메인: 별도의 코드가 이 언어를 읽어들여서 사용
  • 흠 결국 이것도 해당 규칙을 따라야 하는 것으로 보이는데….
  • yaml, json, csv 같은 통용되는 외부 언어 사용 권장
  • 그냥 이렇게 도메인 언어를 구분 짓는구나하고 도메인 언어와 관련된 느낀점은 없음
Edwin222 commented 1 year ago

도메인언어

특성상 자체 도메인 언어(및 파서)를 굉장히 많이 만들어왔다. 내부 도메인 언어 / 외부 도메인 언어 다 해봤음

내부 도메인 언어의 경우 치명적인 단점 중 하나는 도메인 언어로 생각하지 않고 사용하는 경우가 있다는 점이 있다.

목적성을 가지고 한정해놓은 어휘를 임의로 막 확장하거나 / 그 위에 또 다른 시스템을 얹어서 읽을 수 없는 무언가로 만들거나 / 스크립트용 목적으로 만든 프레임워크에 기계적으로 컨벤션과 엄밀함을 강요하거나... (전부 다 실제로 있었던 일들)

연습문제4

    public enum TurtleCommandType
    {
        SelectPen,
        StartDraw,
        EndDraw,
        GoWest,
        GoEast,
        GoSouth,
        GoNorth,
    }

    public interface TurtleCommand
    {
        void Execute();
    }

    public class TurtleParser
    {
        private readonly LineReader reader;

        public IEnumerable GetNextCommand()
        {
            foreach(var textLine in this.reader)
            {
                yield return TurtleCommand.From(textLine);
            }
        }

        private static TurtleCommand From(string line)
        {
            // Line읽어서 커맨드타입 반환
        }
    }

    // 텍스트를 라인단위로 이터레이트
    public class LineReader : IEnumerable {}

연습문제 5

4의 답은 이미 외부 도메인 언어이기도 하다. TurtleCommand 구현체를 생성해서 Execute() 호출을 순서대로 처리하는 것으로 그냥 파서 없이 단독으로도 사용 가능.

연습문제 6

<HOUR> := "1" ~ "23"
<12HOUR> := "1" ~ "12"
<MINUTE> := "0" ~ "59"
<COLON> := ":"
<MERIDIEM> := "am" | "pm"
<24TIME> := <HOUR><COLON><MINUTE>
<MERIDIEMTIME> := <12HOUR><COLON><MINUTE><MERIDIEM>
<TIME> := <24TIME> | <MERIDIEMTIME>

연습문제7 & 8

대학 과제하는 느낌이 물씬 ㅋㅋ 암만 그래도 얘넨 너무 귀찮아서 패스..

만든다면 일단 뒤에서부터 읽어야하는 물건일 것이다.... 라고 쓰려고 했는데 문제 보니 AM PM은 없어도 되는듯? 그럼 왼쪽부터지..