V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
EminemW
V2EX  ›  问与答

如何优雅的限制方法调用者在调用某个方法之前,必须先调用多个依赖的方法

  •  
  •   EminemW · 2022-08-31 16:00:46 +08:00 · 1355 次点击
    这是一个创建于 850 天前的主题,其中的信息可能已经有所发展或是发生改变。
    18 条回复    2022-08-31 19:21:18 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2022-08-31 16:02:50 +08:00
    细说说业务场景.
    billgreen1
        2
    billgreen1  
       2022-08-31 16:09:56 +08:00 via iPhone
    终于遇到一个 xy problem
    billgreen1
        3
    billgreen1  
       2022-08-31 16:10:47 +08:00 via iPhone   ❤️ 1
    EminemW
        4
    EminemW  
    OP
       2022-08-31 16:12:52 +08:00 via iPhone
    @Jooooooooo 就是我一个数据处理类有一些方法 A ,这些方法 A 是需要依赖外部数据的,并且这些数据需要提前处理成方法依赖的格式。我目前是在调用方法之前,先调用依赖数据处理函数,将数据处理成相应的格式,再赋值给类的属性。 方法 A 在执行的时候,再取出需要的数据。这样的问题是调用者可能忘记提前设置方法 A 需要的数据,而如果是把依赖的数据通过方法参数的形式传入,又会导致方法参数太多
    lmshl
        5
    lmshl  
       2022-08-31 16:18:44 +08:00
    f1 :: A -> B
    f2 :: C -> D
    f3 :: B -> D -> E
    f4 :: E -> R

    let b = f1(a)
    let d = f2(c)
    let e = f3(b, d)
    let result = f4(e)

    直接把业务依赖编码进类型里不就完事了?
    micean
        6
    micean  
       2022-08-31 16:18:45 +08:00
    方法参数太多可以考虑把参数整合到一个类里
    Jooooooooo
        7
    Jooooooooo  
       2022-08-31 16:28:06 +08:00
    @EminemW 咋可能忘记...感觉你没抓住问题的重点.
    jamel
        8
    jamel  
       2022-08-31 16:36:27 +08:00
    简单,用函数解决啊,你是什么语言
    EminemW
        9
    EminemW  
    OP
       2022-08-31 16:47:22 +08:00 via iPhone
    @Jooooooooo 可能是我设计有问题


    type Handler struct {
    A map[string]interface{}
    B map[string]interface{}
    C map[string]interface{}
    D map[string]interface{}
    E map[string]interface{}
    }

    func (a *Handler) SetA(inputList []interface{}) {
    for _, input := range inputList {
    a.A["key"] = input
    }
    }

    func (a *Handler) DoA() (result map[string]string, err error) {
    // do something
    return
    }

    func (a *Handler) DoB() (result map[string]string, err error) {
    // do something
    return
    }

    func (a *Handler) DoC() (result map[string]string, err error) {
    // do something
    return
    }

    func NewHandler() Handler {
    return Handler{
    A: map[string]interface{}{},
    B: map[string]interface{}{},
    C: map[string]interface{}{},
    D: map[string]interface{}{},
    E: map[string]interface{}{},
    }
    }

    func main() {
    instance := NewHandler()
    instance.SetA([]interface{}{})
    //忘记 SetB SetC

    result, err := instance.DoA()
    result, err = instance.DoB()
    result, err = instance.DoC()
    }
    EminemW
        10
    EminemW  
    OP
       2022-08-31 16:48:57 +08:00 via iPhone
    @lmshl 这种方式我想过,应该是符合我需求的,缺点是,类型会多很多
    EminemW
        11
    EminemW  
    OP
       2022-08-31 16:49:31 +08:00 via iPhone
    @jamel Go ,可以大概解释一下吗
    renmu
        12
    renmu  
       2022-08-31 16:53:38 +08:00 via Android
    怎么会忘记呢,你调用处理数据的函数然后不传数据是吧。
    jamel
        13
    jamel  
       2022-08-31 16:56:57 +08:00
    @EminemW 一个方法里面接受一个函数参数,函数参数里面进行初始化数据,或者返回数据,再接受第二个函数参数,进行数据处理返回最终你想要的数据
    xiaojianghu
        14
    xiaojianghu  
       2022-08-31 16:59:02 +08:00
    感觉可以设计成 A 、B 、C 、D 、E 为内部类对象,Do 方法在内部类实现,可以抽象出来一个接口,SetA 返回 A 对象
    xiaojianghu
        15
    xiaojianghu  
       2022-08-31 16:59:48 +08:00
    instance.SetA().Do()
    jamel
        16
    jamel  
       2022-08-31 17:04:15 +08:00
    fun a(initData: () -> Unit, handlerData: () -> Map<String, String>): String {
    initData()
    val map = handlerData()

    return ""
    }

    fun main() {
    a({
    // 初始化数据
    val str = "fdsa"
    }, {
    // 数据处理
    val substring = "fdas".substring(1, 2)
    mapOf()
    })
    }
    fkdtz
        17
    fkdtz  
       2022-08-31 19:20:12 +08:00
    如果你参数是必传的,那再怎么处理,这个参数的值总得被初始化吧,你期望是怎样的呢?
    justanetizen
        18
    justanetizen  
       2022-08-31 19:21:18 +08:00
    middleware
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:33 · PVG 05:33 · LAX 13:33 · JFK 16:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.