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

终于明白为什么初学 依赖注入 时,总是搞不清依赖的意思

  •  
  •   BeautifulSoap · 2021-01-12 17:55:35 +08:00 · 3264 次点击
    这是一个创建于 1413 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前第一次接触依赖注入时,看着各种介绍文章介绍 “依赖” 这个词的意思,总是处于那种虽然看得懂讲了什么,但是总感觉有点懵的状态,虽说之后也是理解了,但对这种曾经和别人的隔阂感总是有种奇怪的感觉

    最近在整理知识写文章的时候才猛然发现到底是什么原因,原来这是个语文或者中文表达的问题

    因为在中文里(这里指普通人或者第一次接触依赖注入这类概念的人), 依赖 这个词是个动词,即 A 依赖 B,或者作为名词的时候用法也是非常固定的 A 对 B 有依赖 这种句式

    但是依赖注入中,依赖 这个词的意思是反过来代指对 A 有依赖的那些项目。用这种意思来做表述的话就是: A 的依赖是 B 。这种用法是普通的中文表述中是非常奇怪的也几乎见不到的,这也就导致初期的理解会变得有一定困难。更加正确的说法我觉得应该是 依赖项A 的依赖项是 B

    然后我想了下,会出现这种问题的原因可能还是出在翻译上,英文叫 Dependency Injection,就这么直接粗暴翻译下就是依赖注入。可是 DI 这个词中的 Dependency 对应到中文里比较合适应该是 依赖项 这个词,也就是说是 依赖项注入。这方面可以参考下日语中对 DI 的翻译: 依存性の注入 ,有把这部分意思翻译出来。

    这次的发现虽然是非常小的事情,但让我再次加深了下面两条的理解:

    1. 翻译真的很难,一个好的翻译有时候真的能降低理解概念的门槛

    2. 一个人一旦学会了某个知识,就无法想象这个知识在不会的人心里是怎样的。比如这次,懂了依赖注入概念的人可能很多人都没有意识到,在不懂这个概念的人眼里,“依赖”这个词是有一定理解障碍的。这也提醒我,在写文章或者教别人的时候,需要更多站在不懂这个知识的人的角度来思考怎么传达自己的知识

    22 条回复    2021-01-14 13:55:10 +08:00
    johnsona
        1
    johnsona  
       2021-01-12 17:57:40 +08:00 via iPhone
    注入依赖
    killerv
        2
    killerv  
       2021-01-12 18:02:27 +08:00
    是的,翻译是很重要的,参考“鲁棒性”
    wangxiaoaer
        3
    wangxiaoaer  
       2021-01-12 18:06:32 +08:00 via iPhone
    你想多了,在 DI 这个语境下,依赖是个名词。
    feather12315
        4
    feather12315  
       2021-01-12 18:07:24 +08:00 via Android
    …从来没感觉依赖这个词难理解过,倒是初学编程时候,对递归不理解。
    表达的是:每个人对词汇的理解难易是不同的,这东西没法强行统一。
    我倒觉得依赖项更难理解。
    fiveelementgid
        5
    fiveelementgid  
       2021-01-12 18:09:49 +08:00 via Android
    DI 啊,我一开始也看了半个月才看懂,加油咯
    BeautifulSoap
        6
    BeautifulSoap  
    OP
       2021-01-12 18:14:43 +08:00
    @wangxiaoaer
    我顶楼里可没说过 DI 里的“依赖”不是名词,只是 DI 里依赖的用法在普通中文里不怎么见到
    EPr2hh6LADQWqRVH
        7
    EPr2hh6LADQWqRVH  
       2021-01-12 18:19:25 +08:00
    所以说大学生过四级很重要啊,四级不过怎么搞懂外面进来的这些东西呢
    BeautifulSoap
        8
    BeautifulSoap  
    OP
       2021-01-12 18:25:46 +08:00
    @feather12315 我觉得还是能评判的,把这词汇和解释做一定的给不懂或没接触过的人看,问他们是否能大致理解或理解起来有没有负担就行了

    我上面有提到过,一个人一旦学会了某个知识,就无法想象这个知识在不会的人心里是怎样的。这也是很多人不擅长教人知识的原因。“这知识你怎么就是不懂!这么笨!” “这定律怎么就不理解!” ,在我教过一些人之后这就是我最大的感悟,教人这事真的是需要训练和多站在不懂的人的角度来考虑的。可能这也是为什么好多大学教材写得让人感觉不是人话的原因吧
    BeautifulSoap
        9
    BeautifulSoap  
    OP
       2021-01-12 18:28:17 +08:00
    @fiveelementgid @avastms
    是的,我之前学 IoC 、DI 、DIP 的时候真的就是后来直接跑去看英文的 wiki 和相关引用的文章,才算有了一定的理解
    fiveelementgid
        10
    fiveelementgid  
       2021-01-12 18:32:13 +08:00 via Android
    给你一个 asp.net core 的文档里的:DI 实际用于在一个管理系统中标注一个 interface 和与他对应的 class,当你在 constructor 使用这个接口的时候他会给你创建一个对应的 object (也称为 constructor injection)
    fiveelementgid
        11
    fiveelementgid  
       2021-01-12 18:33:03 +08:00 via Android
    @BeautifulSoap emmmmmm 我英语也不好,建议你丢掉中文文献,多看看就会了
    lidlesseye11
        12
    lidlesseye11  
       2021-01-12 18:43:26 +08:00
    手动点赞
    要翻译首先得中文水平牛逼,其次得能理解原作者想表达的思想,第三得用心推敲。
    国内目前还没见到过的不错的译者。
    yeqizhang
        13
    yeqizhang  
       2021-01-12 18:47:39 +08:00
    nice,java 里通常就是说属性值的注入...
    lxilu
        14
    lxilu  
       2021-01-12 21:57:31 +08:00 via iPhone
    注入依赖 +1
    liyaoo
        15
    liyaoo  
       2021-01-13 08:35:58 +08:00 via Android
    是的,开始我也理解为动词,就很懵逼
    ninja543
        16
    ninja543  
       2021-01-13 08:52:38 +08:00
    日语理解哈哈哈,其实看英文文献带两本字典就够了,英英和英日,便于理解
    SmiteChow
        17
    SmiteChow  
       2021-01-13 11:13:37 +08:00
    翻译是否准确还需要对照原文看,如果不看原文是不能下结论的。

    依赖注入通常来讲需要编程序言支持反射机制( reflection ),通常由框架( framework )在运行时动态获取用户代码元信息( code meta )。

    但随着语言特性的发展,解包( destruction )成为了新的更加简洁的实现方式。
    SWALLOWW
        18
    SWALLOWW  
       2021-01-13 15:39:44 +08:00
    就是中文,道地性你们能理解吗
    no1xsyzy
        19
    no1xsyzy  
       2021-01-14 09:44:06 +08:00
    @lidlesseye11 不局限于纯粹技术内容的话,随想散文和小说都有翻译做得不错的……
    应用文翻译更难(需要对这方面技术有了解?)?
    还是说应用文跨语言比较容易,翻译的收益不是很大?

    @BeautifulSoap 你主题里的解释太复杂了
    简单地说,就是你理解为
    〔动〕〔宾〕
    依赖  注入
    而其实这个词是
    〔偏〕〔正〕
    依赖  注入

    另外,“注入依赖” 是动宾结构的动词性短语,但结合了中文动词当名词的用法,确实本土化。
    尤其是当放在介词后面的时候,动宾结构会自动地被当作介宾结构的宾语(“通过注入依赖”)。
    BeautifulSoap
        20
    BeautifulSoap  
    OP
       2021-01-14 10:22:34 +08:00
    @no1xsyzy 并不是的,我虽然没法从语法角度来阐述,但是我的想法是:

    1. 依赖作为动词理解的话 依赖(动)注入,会让人理解成:xxx 依赖注入这项技术,自然这是不正确的,而且也会让人费解

    2. 依赖在动词之外还有种名词化的用法,但是这个时候的用法是非常固定的,类似 我对你的依赖;你是我的依赖。如果将其“依赖注入”中的依赖理解成名词这种意思,那么理解出来的意思就是: 在 A 中注入对 xxx 的依赖。虽然这句式看起来和依赖注入的意思——在 A 中注入它所依赖的 xxx 非常像,但是意思却是完全不对的

    我在学习依赖注入的时候,主要是陷入了第二种的理解偏差中
    BeautifulSoap
        21
    BeautifulSoap  
    OP
       2021-01-14 10:54:47 +08:00 via Android
    @no1xsyzy 至于你说的以及上面人说的 依赖注入 还是 注入依赖,我觉得可能并不是阻碍理解的关键

    依赖注入这个词,语法上正确的理解方式实际上应该是动宾倒置。在中文里,动宾倒置算是知道非常广的用法,最出名的一个例子应该是初中或高中都有教过的 “古人诚不我欺” 这句
    但是为什么到了依赖注入中,就偏偏让人产生理解偏差了?我觉得问题在于“依赖”这个词的词性让人没法一下联想到动宾倒置这种用法,就算联想到了,对“依赖”这个词的理解也可能会有偏差

    所以我举了一个例子 依赖项注入,这里依赖项是指代明确的一个名词,可以方便人反应过来其意思。所以 DI 这个词的翻译,可能无论是依赖项注入 /注入依赖项,还是依赖注入 /注入依赖,重点应该在对 Dependency 的释意上而不是语法顺序上
    no1xsyzy
        22
    no1xsyzy  
       2021-01-14 13:55:10 +08:00
    @BeautifulSoap #20 哦我没想到第二种偏差
    那样的话,实际上英文 DI 也是有这个问题的。
    到底是原本其实没有任何依赖关系,通过注入形成了新的 Dependency (或者说 Optional Dependency,或者能够使得一切皆 Optional Dependency )
    还是这里有个 Dependency 需要调用者提供,不提供不能工作。
    (可以参考下 Python 的几个 mock 模块,能够覆盖几乎任何属性值任何 obj.meth 或者 obj.mem 的工作方式改为返回一个 dummy 对象。在 Python 里一切皆可以是 Optional Dependency )

    正确的名称应当是 Deferred Dependency ?

    #21 现代汉语动宾倒置几乎不存在……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3292 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:50 · PVG 20:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.