[内详]B中有A的实例,A,B定义了相同的一个event,A抛消息给B,再由B往外抛,是否合理?

时间:2021-10-20 03:31:07
分层是一种比较好的模块化方法, 实际使用中也确实如此
但是这样会出现很多代码的重复, 比如标题中情况, 关于消息处理, 就有重复, 感觉与 DRY(Don't Repeat Yourself) 又抵触了
大家怎么认为? 又或者是如何处理这种问题的? 欢迎讨论

class A {
    public event EventHandler TheEvent;
    protected void RaiseTheEvent()
    { 
        if (TheEvent != null) {
            TheEvent(this, EventArgs.Empty);
        }
    }
}

class B {
    public event EventHandler TheEvent;
    protected void RaiseTheEvent()
    { 
        if (TheEvent != null) {
            TheEvent(this, EventArgs.Empty);
        }
    }

    A _a = new A();

    B()
    {
        _a.TheEvent += delegate
        {
            RaiseTheEvent();
        };
    }
}

11 个解决方案

#1


A中的消息给A的调用者使用
B中的消息给B的调用者使用

没有冲突

如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心

#2


LZ的意思是代码冗余了?

有时为了便于改动维护而分层确实会造成部分代码冗余

#3


这种设计很合理,不同事件有不同用途,还可继承接口实现操作

#4


  public class Sender
    {
        public delegate void EventHandler(object sender);
        public event EventHandler Event;

        public void TEvent()
        {
            Console.WriteLine("event");
            Event(this);
        }
    }
   class Receiver
    {
        public Receiver(Sender sender)
        {
            sender.Event +=new Sender.EventHandler(OnEvent);
        }
        private void OnEvent(object sender)
        {
            Console.WriteLine("event" );
            Console.Read();
        }
    }

#5


引用 3 楼 wuyq11 的回复:
这种设计很合理,不同事件有不同用途,还可继承接口实现操作

确实有合理的地方,但是楼上也有人提到了代码冗余
"copy-paste" 不是编程的大忌么,如果要分层,消息的层层转发势必会导致这样的重复代码,所以想知道有没有更好的办法?

btw. 这个方法在实际使用中也确实烦人,改了一边,另一边也要注意不能遗漏,代码姑且不说,就是注释也要保持同步

#6


我并没看出哪里有代码冗余,只是你在A和B里的事件名称相同而已。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。

#7


楼上的分析到位,把对象之间的依赖性进行分拆。

#8


有点像head first 第一章。

#9


看来多数朋友还是认可这样的处理方式 ;)

#10


我不喜欢,但我也在用.....

#11


我就这种类似的办法!


为了后期,就这样!

#1


A中的消息给A的调用者使用
B中的消息给B的调用者使用

没有冲突

如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心

#2


LZ的意思是代码冗余了?

有时为了便于改动维护而分层确实会造成部分代码冗余

#3


这种设计很合理,不同事件有不同用途,还可继承接口实现操作

#4


  public class Sender
    {
        public delegate void EventHandler(object sender);
        public event EventHandler Event;

        public void TEvent()
        {
            Console.WriteLine("event");
            Event(this);
        }
    }
   class Receiver
    {
        public Receiver(Sender sender)
        {
            sender.Event +=new Sender.EventHandler(OnEvent);
        }
        private void OnEvent(object sender)
        {
            Console.WriteLine("event" );
            Console.Read();
        }
    }

#5


引用 3 楼 wuyq11 的回复:
这种设计很合理,不同事件有不同用途,还可继承接口实现操作

确实有合理的地方,但是楼上也有人提到了代码冗余
"copy-paste" 不是编程的大忌么,如果要分层,消息的层层转发势必会导致这样的重复代码,所以想知道有没有更好的办法?

btw. 这个方法在实际使用中也确实烦人,改了一边,另一边也要注意不能遗漏,代码姑且不说,就是注释也要保持同步

#6


我并没看出哪里有代码冗余,只是你在A和B里的事件名称相同而已。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。

#7


楼上的分析到位,把对象之间的依赖性进行分拆。

#8


有点像head first 第一章。

#9


看来多数朋友还是认可这样的处理方式 ;)

#10


我不喜欢,但我也在用.....

#11


我就这种类似的办法!


为了后期,就这样!