Open DaehunGwak opened 1 year ago
fun operate(command: String, option: Int?) {
when(command):
"P":
val number = option?: processException()
Picker.select(number)
"D":
"W":
"N":
"....":
}
그냥 함수로 짜면 되는데 귀찮아서 패스..
BNF 문법이 무엇인고 하고 찾아봤더니, 신택스 트리를 구문화 해놓은 것으로 이해했다.
결국 시간 단위에 대한 BNF 표기법이 필요하다는 뜻으로 이해를 했고 답지를 봐서 이해했다 -_-;
패스
패스
언어의 한계가 곧 자기 세계의 한계다 - 루트비히 비트겐슈타인
- Tip 22. 문제 도메인에 가깝게 프로그래밍하라.
- 도메인 : 문제를 해결 하기 위한 영역
- 큐컴버는 행동 기반 테스트 코드이긴 하지만 결국 코드… 사업부에서 안봄
- 최대한 동작하는걸 보여줘야 함
- 도메인 언어의 특성
- 내부 도메인: 랭귀지 종속적
- 외부 도메인: 별도의 코드가 이 언어를 읽어들여서 사용
- 흠 결국 이것도 해당 규칙을 따라야 하는 것으로 보이는데….
- yaml, json, csv 같은 통용되는 외부 언어 사용 권장
- 그냥 이렇게 도메인 언어를 구분 짓는구나하고 도메인 언어와 관련된 느낀점은 없음
도메인언어
특성상 자체 도메인 언어(및 파서)를 굉장히 많이 만들어왔다. 내부 도메인 언어 / 외부 도메인 언어 다 해봤음
내부 도메인 언어의 경우 치명적인 단점 중 하나는 도메인 언어로 생각하지 않고 사용하는 경우가 있다는 점이 있다.
목적성을 가지고 한정해놓은 어휘를 임의로 막 확장하거나 / 그 위에 또 다른 시스템을 얹어서 읽을 수 없는 무언가로 만들거나 / 스크립트용 목적으로 만든 프레임워크에 기계적으로 컨벤션과 엄밀함을 강요하거나... (전부 다 실제로 있었던 일들)
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 {}
4의 답은 이미 외부 도메인 언어이기도 하다. TurtleCommand 구현체를 생성해서 Execute() 호출을 순서대로 처리하는 것으로 그냥 파서 없이 단독으로도 사용 가능.
<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>
대학 과제하는 느낌이 물씬 ㅋㅋ 암만 그래도 얘넨 너무 귀찮아서 패스..
만든다면 일단 뒤에서부터 읽어야하는 물건일 것이다.... 라고 쓰려고 했는데 문제 보니 AM PM은 없어도 되는듯? 그럼 왼쪽부터지..
진도
2.14 도메인 언어
일시