프로그래밍

c# 옵저버 패턴 이렇게 해봤는데... 이게 맞을까 의문임

코드부터 읽는 건 비추고 일단 맨 아래 변명부터 읽어 주셈....

거기에 코드를 왜 이렇게 작성했는지 적어 두겠음

 

 

1. Observable은 옵저버를 가지는 객체가 상속받는 클래스임

 

public abstract class Observable
{
    private Dictionary<string, ObserverContainer>   observers = new Dictionary<string, ObserverContainer>();

 

    public void Subscribe(IObserver _NewObserver)
    {
        string tag = _NewObserver.ContainerType();

 

        if (!observers.ContainsKey(tag))
            observers.Add(tag, _NewObserver.CreateContainer());

 

         observers[tag].Subscribe(_NewObserver);
    }

 

    protected T FindObserver<T>()
        where T : ObserverContainer, new()
    {
        string tag = typeof(T).Name;

 

        if (!observers.ContainsKey(tag))
            return new T();

 

        T container = observers[tag] as T;

 

        if (null == container)
            return new T();

 

        return container;
    }
}

 

2. 옵저버를 저장한는 클래스임

 

public abstract class ObserverContainer
{
    protected List<IObserver> observerList = new List<IObserver>();

 

    public void Subscribe(IObserver _NewObserver)
    {
        observerList.Add(_NewObserver);
    }
}

public class OnCrashObserverContainer : ObserverContainer
{
    public void Notify(Collider coll)
    {
        foreach (OnCrashObserver elem in observerList)
            elem.FiledChange(coll);
    }
}

 

3. 옵저버임

 

public interface IObserver
{
    public abstract string                  ContainerType();
    public abstract ObserverContainer CreateContainer();
}

public class OnCrashObserver : IObserver
{
    static string containerTag = "OnCrashObserverContainer";

    ObserverContainer IObserver.CreateContainer()
    {
        return new OnCrashObserverContainer();
    }

    string IObserver.ContainerType()
    {
        return containerTag;
    }

    public void FiledChange(Collider coll)
    {
        Debug.Log("OnCrashObserver::FiledChange(...) ");
    }
}

 

 

 

왜 이렇게 했냐면요...

Observable 상속 받는 클래스 그러니깐 자식 클레스에서

 

FindObserver<OnCrashObserver>()->Notify(매개변수 들) 이렇게 호출하고 싶었음...

옵저버가 늘어나면 다양한 매개변수를 가지는 Notify 함수를 호출하고 싶었음

그래서 옵저버 컨테이너를 중간에 낀거임

 

여기서 의문점은 어떻게 하면 Notify가 다양한 매개변수를 받을 수 있을까요....

c# 가변인자를 쓰기에도 에메하고(어떤 자료형이 올 지 모르겠음;;;)

그렇다고 c++ void 포인터를 캐스팅하는 방식은 c#에서 안 될거 같고 ㄹㅇ 골치아픔....

 

제네릭하고 매개변수를 템플릿으로 해버리는 건 어떻까해봤는데 이것도 전달 과정에서 이상해질거 같음....

Notify 매개 변수가 다양한 옵저버 패턴은 어떻게 구현할 수 있을까요?

 

=================

 

아니면 빌더를 혼합하는 방식이 생각나기는 한데

 

예를 들면 

 

FindObserver<OnCrashObserver>()

 .Set_Parameta1(변수)

 .Set_Parameta2(변수)

 .Set_Parameta3(변수)

.Notify();

 

class OnCrashObserver
{

OnCrashObserver Set_Parameta1(변수)

{

    멤버변수 1 = 변수;

 

    return this;

}

 

// 이하 생략

 

void Notify()

{

Set_Parameta1 ~ Set_Parameta3을 멤버로 가진후 Notify 함수 내에서 사용하기

}

}

 

 

13개의 댓글

2023.11.29

정확히 어떤걸 원하는거임? 옵저버마다 수신해야 하는 데이터타입이 다 다른건지 아니면 단순하게 수신하는 매개변수를 여러개 받고싶은건지, 여러개 받는다면 데이터타입이 동일한건지

0
2023.11.29
@6974

옵저버의 notify 함수의 매개변수가 다르길 원함

 

어떤 옵저버의 notify는 string을 받고 어떤 옵저버는 class 2개와 string을 가지는 방식을 원하는 거임

요약하면 수신받을 자료형과 갯수가 다 다르길 원함

 

그래서 옵저버 컨테이너와 옵저버가 쌍을 이뤄야 하기 때문에

옵저버 안에 자신과 맞는 컨테이너를 생성하는 거임

(옵저버 컨테이너의 notify의 매개변수와 옵저버의 fieldChange의ㅜ매개변수가 됨)

0
2023.11.29
@RX7900XTX

옵저버 개수가 달라지면 빌더는 택도없고 안티패턴이긴 한데 타입이 전부다른 List나 Dictionary를 쓰는 방법이 있긴함

FieldChange를 매개변수에 맞게 싹다 오버로딩하고 list, dict에 전달할 것들을 넣어서 notify에서 꺼내서 인터페이스 호출하는 방법인데 좋아보이지는 않음

0
2023.11.29
@6974

이해가 잘 안 가는데요

c#의 언박싱, 박싱을 이용하라는 말씀인가요?

 

예를 들면 list<object>하면 모든 타입을 저장할 수 있으니깐 이걸 notify의 매개변수로 넘기면 된다는 거죠?

 

흠... 박싱, 언박싱이면 비용이 크긴한데 가변인자랑 같이 사용해도 될거 같기도 하고 흠... 고민되네요

0
2023.11.29
@6974

용도는 충돌이 일어났을 때 notify룰 할 건데 이 때 내가 가지는 전략 패턴 컴포넌트둘이 순회하면서 총합 데미지를 계산해야 됨

그러므로 notify(ref float totaDMG)이 되어야 됨

 

그와 반대로 새로운 아이탬을 창착할 때 또는 장비 레벨업을 할 때는

notify(전략 패턴[] strategys) 이런 식으로 받아야됨

0
2023.11.29
@RX7900XTX

특정상태들을 정의해놓고 state를 notify하고 옵저버에서 state에 맞게 알아서 행동하도록 하는게 나을것 같은데? 그런식으로 하면 결합도가 너무커짐

0
2023.11.29
@6974

아무래도 notify 함수를 여러개 만드는게 답임? 오버로딩하라는 말씀이시죠?

 

사실 결합도가 너무 높아서 옵저버 안에서 컨테이너를 생성하는 거긴 함...

잘못 바인드하면 엄청 위험하거나 이상하게 사용되니깐 불안해서 글 올린거임 ㅇㅇ....

0
2023.11.29
@RX7900XTX

지금 느낌은 observable 구현체에서 별도 컴포넌트들을 제어하는 느낌인데 원래 옵저버 패턴의 사용목적이랑은 다른 느낌임. 물론 정답은 없지만 게임만드는거면 이렇게 제어하는 별도 패턴이 있을걸? 내 개인적 견해는 observable은 그냥 상태만 전달하는게 좋다임. 상태에 대한 결정은 oberserver들이 따로하고

0
2023.11.29
@6974

사실.... 유니티엔진 처음 해 보는데... 덕타이핑이 발생되서 ㅈ됨...

대략적으로 공격, 이동, 투사체 생성, 패시브 4분류해서

 

main 스크립트인 unit, gadget 등등이 위 전략 가져와서

데이터를 뿌리는 거임

 

이게 장점은 재사용은 좋운데 데이터 뿌리고 제어할 때 변수가 너무 많음... 메인 코드에서 하나만 범용성없이 예외처리가 필요하면 저리 되는거임...

 

이럴 줄 알았으면 언리얼처럼 유닛 종류 10개 있으면 클래스를 10개 만들거나 블루프린트에 상속해서 찍어낼걸..... 망함 ㄹㅇ ㅋㅋㅋ

 

0
2023.11.29

하나의 notify로 모든 걸 해결하겠다는 건 조금 좋지 않은 생각인 것 같구요. 각 notify의 형태에 해당하는 observer 클래스들을 각각 정의하시고 Observable은 notify하고 싶을 때 해당하는 container들에게 notify해달라고 위임하면 되지 않을까요?

0
2023.11.29
@스비니

하 아니면 링크드 리스트처럼 만들까 고민 중임...

약간 연쇄 책임사슬?

 

옵저버가 동일한 옵저버를 가리키면 되지 않을까....

옵저버애 notify(매개변수) 함수만둘고

 

자신의 filedChange 호츌하고

nextObserver.filedChange(매개변수) 이런식으로요

 

ㅈㄴ 고민중....

0
2023.11.29
@RX7900XTX

chain responsibility는 중간에 책임이 있는 녀석이 위임의 사슬을 끊어버리고 문제를 해결할 때(한 문제는 한 객체만이 해결) 사용되는 패턴인데, broadcasting 되어야 하는 지금 상황에는 약간은 일반적인 의도에서 벗어나는 감이 있는 것 같아요. 뭐 사실 구현 측면에서 불가능한 방식은 아니니 상관은 없지만..

 

제 생각에는 만약 현재 설계가 data-driven하게 설계가 되어있다면

1) 아예 관련 있는 모든 데이터들을 통째로 broadcasting해주거나

2) data들을 다루는 방식에 따른 분류를 만들어서 그 분류에 맞게 인터페이싱하는 것 둘 중 하나를 선택하시는 게 좋아보여요.

0
2023.11.29
@스비니

아직 초급자라 말씀을 이해 못하겠네여...

요약하면 Notify에 매개변수를 어떠한 상속관계있는 클래스나 구조체로 전달하라는 말씀이신가요?

상속관계 클래스면 Notify 내부에서 캐스팅하면 편하겠네요

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5695 [프로그래밍] 윈도우 부팅화면 봐주실분 바나나맛두부 0 18 시간 전 134
5694 [프로그래밍] 아 시발 퇴사마렵다 9 인간지표 0 1 일 전 334
5693 [프로그래밍] C#이 ㅈ사기 언어인 이유 18 ye 4 2 일 전 851
5692 [프로그래밍] 요즘 모바일 개발은 어떤 걸 사용하나요? 13 커피좋아용 0 4 일 전 354
5691 [프로그래밍] 취준생 안드로이드 팀플 주제 머할까요... 8 조강현 0 5 일 전 240
5690 [프로그래밍] 공통코드테이블은 대체 왜 만드냐 9 잠적자 0 6 일 전 440
5689 [프로그래밍] 토이프로젝트 주제 선정 3 개드립눈팅1세대 0 6 일 전 240
5688 [프로그래밍] 엥 구글 플러터 유기각 재는거임?? 4 최수연 0 8 일 전 371
5687 [프로그래밍] 반도체 장비 업계인 있음? 9 캡틴띠모 0 9 일 전 306
5686 [프로그래밍] 안드로이드 책 추천좀 6 집에가게해줘 0 10 일 전 162
5685 [프로그래밍] 폰 스크리닝 해 본 사람 있어? 3 무지개빛푸딩 0 10 일 전 404
5684 [프로그래밍] jsp 트리메뉴 만들고있는데 구상한게가능한지 의견좀물어볼께 11 평택국 0 11 일 전 181
5683 [프로그래밍] JPA 도와줘어억 ㅠ 10 모그리또 0 11 일 전 271
5682 [프로그래밍] 의사는 뽑는 인원 제한하는데 부캠은 왜 제한 안 할까 5 조강현 0 13 일 전 388
5681 [프로그래밍] 그 혹시 게임쪽 종사자 있음? 17 god79ii 0 17 일 전 648
5680 [프로그래밍] 코린이 ㅅㅂ 뭐가 문젠지 모르겠어요 9 집에가게해줘 0 17 일 전 472
5679 [프로그래밍] Dear Imgui 라고 아시나요? 2 년째모쏠 0 17 일 전 255
5678 [프로그래밍] 현업개발자분들 주말엔 편하게 쉴수있나요? 10 키로 0 18 일 전 896
5677 [프로그래밍] 무엇이든 물어보세요. 28 변현제 0 20 일 전 433
5676 [프로그래밍] 개발자보단 엔지니어가 취업이 잘됨 5 iillillill 2 21 일 전 778