V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wildmelon
V2EX  ›  程序员

多层调用/回调的业务代码有比较通用的优化方式吗?

  •  1
     
  •   wildmelon · 343 天前 · 1279 次点击
    这是一个创建于 343 天前的主题,其中的信息可能已经有所发展或是发生改变。

    语言是 Unity C#,场景其实就是游戏里的那种很多层的弹窗确认取消跳转。

    说来惭愧,下面伪代码还是"优化"拆分过的。 之前塞在一个函数中,不管是代码本身(层级过多),还是业务逻辑都很难理解维护。

    目前这里的 afterFinal 其实只在最后才用到,却穿过多个函数。考虑把每个步骤的 Step Event onSuccess 封装成一个类,又存在一定内存消耗(当然如果封装的维护性和阅读性很好的话是可以接受的)

    思来想去还是先咨询各位,有没有比较通用的解决方式或者专业术语是适用于这类需求的?

    function void Step1(Event afterFinal)
    {
      if (condition1)
      {
        new ConfirmWindows1(onSuccess: ()=>{ Step2(afterFinal); });;
      }
      else
      {
        Step2();
      }
    }
    
    function void Step2(Event afterFinal)
    {
      if (condition2)
      {
        new ConfirmWindows2(onSuccess: ()=>{ Step3(afterFinal); });;
      }
      else
      {
        Step3();
      }
    }
    
    function void Step3(Event afterFinal)
    {
      if (condition3)
      {
        FinillyDoSomething();
        afterFinal?.Invoke();
      }
    }
    
    8 条回复    2023-12-17 10:13:15 +08:00
    netabare
        1
    netabare  
       343 天前   ❤️ 1
    点开标题的时候想的是 Monad ,但是既然是 Unity C#的话感觉好像 op 的处理方法也有好处?毕竟 Unity 比较吃性能。

    突发奇想,不知道能不能把三个 step 函数写成三个函数变量,塞进一个数组里,稍微重构一下代码,不过总觉得怎么弄都会有损耗。
    gongquanlin
        2
    gongquanlin  
       343 天前
    责任链封装一下?
    SalimTerryLi
        3
    SalimTerryLi  
       342 天前
    对付 callback hell 应该都可以上 coroutine/async 吧? C#是有协程支持的,但我不知道它的底层实现的代价,因为我不写 C#
    SalimTerryLi
        4
    SalimTerryLi  
       342 天前
    原理:嵌套的逻辑都依赖于上下文,但是这个上下文又具有一个特点:和栈一样,单方向由前置操作决定后续操作。所以我觉得应用有栈协程可以很好的处理这类业务逻辑。注,有栈/无栈协程在不同的定义下似乎存在歧义,我是指在协程内运行的业务代码拥有 per-coro 的栈。

    新号发不了长的。就离谱
    SalimTerryLi
        5
    SalimTerryLi  
       342 天前
    一个大概的思路,非最优实现:

    - 一个完整业务流程封装为一个 public async Task<Foo> async_work(){}函数
    - var result = async_work().wait() 来启动并阻塞执行异步任务(或者不阻塞?不清楚 C#的控制流)
    SalimTerryLi
        6
    SalimTerryLi  
       342 天前
    后面的发不出来了
    miaoxia
        7
    miaoxia  
       342 天前 via Android
    rx.net 专门处理回调地狱
    hitmanx
        8
    hitmanx  
       340 天前
    这个看着就像是责任链: https://refactoringguru.cn/design-patterns/chain-of-responsibility

    它的一个典型处理的问题也是在 GUI 中由哪个组件来响应事件。

    Step1\2\3 各包装成一个组件,根据 condition 来决定是否向后传
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:28 · PVG 02:28 · LAX 10:28 · JFK 13:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.