C#에서 객체지향 남용 리팩토링하기 | CodeMaze

숫자 등으로 처리해야 할 경우는 보통 동적 생성의 목적에 있어서인데 그것은 그것대로 가능 할 것이고요,

var animals = Enumerable.Range(1, 3).Select(x => Animal.Create(x));
foreach (var animal in animals)
    Console.WriteLine(animal.Name);

코드로 접근해서 생성할 경우는 아래의 방법이 지금은 최선인 것 같습니다.

var dog = Animal.Create(Dog.ConstType);
var cat = Animal.Create(Cat.ConstType);
var pig = Animal.Create(Pig.ConstType);
3개의 좋아요

image

본문이 수정되었습니다 ^^;

3개의 좋아요

:+1:

사실, 원글은 저것말고도 LSP 위배를 부추기는 등, 문제의 소지가 더 있긴 합니다.

그런 것들이야 걸러서 보면 되니까 문제는 아닌데…첫번째 예제에서 원글과 상관없지만, 꽤 흥미로운 케이스를 발견한 것입니다.

달리 비유하면, 레이싱 게임에서 사용자가 차를 고르는 화면은 현재 사용 가능한 차들을 전부 보여 주는 상황인데, 이를 OCP를 위배하지 않으려면 어떻게 해야하는가라는 물음이죠.

이 글의 많은 댓글에서 볼 수 있듯이, OCP 를 위배하지 않고 서브클래스 목록을 보여 준다는 것이 결코 만만치는 않네요.

1개의 좋아요

결국에는… 소스 생성기의 도움을 받아야 할 것 같습니다. Reflection은 NativeAOT 에서는 사용할 수 없기 때문에 추세가 소스 생성기의 도움을 받는 방향으로 가고도 있습니다.

그런데 반대로 원칙은 원칙일 뿐이니까 너무 타이트하게 그 규칙을 지킬 필요는 없다는 의견을 내봅니다.

2개의 좋아요

Start:
짧으면 3개월 길면 1년… 정도 뒤에 내 코드를 보면… 이거 도대체 뭔 정신으로 쓴 거임? 하는 자괴감이 들기도 하죠… 그런 자괴감에서 벗어나기 힘든 이유가…

굳이 그거까지…
선택의 문제…
혹은 몰라서…

등으로 치부하며 타협해버린 짧으면 3개월, 길면 1년 정도 과거의 내 탓이 크지 않을까요? ^^
우리가 닷넷의 프레임워크들을 사용하면서 느끼는 익숙함과 편안함을 유독 내 코드에서는 느낄 수 없는 이유가 그런 타협이 원인이겠죠.

물론, 매일매일 타협을 강요받는 현실에 처한 개발자들에게는 배부른 소리로 들릴 수 있습니다.

어떤 유튜브 채널인지 기억이 정확하게 안나는데, 삼성에서 10년 넘게 일하다가 퇴직 후 시간이 좀 있어서 오픈소스 프로젝트에 참여하기 위해, 소스 코드를 제출했는데, 퇴짜를 맞았다고 하더군요.

동작에는 아무런 문제 없는데, 퇴짜를 맞으니, 오기가 생겨 1년 가까이 시도를 했지만, 여전히 퇴짜를 맞았다고 하네요. 퇴짜 맞은 이유 대부분이 “너만 읽을 수 있잖아” 였답니다.

아마 “너” 앞에는 “방금 소스코드를 작성해서 흐름을 기억하고 있는” 이라는 수식어가 생략된 것이겠죠.

그 "너"는 goto Start;

1개의 좋아요