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

什么是高内聚、低耦合?

  •  
  •   superPershing · 2017-04-26 19:40:37 +08:00 · 3117 次点击
    这是一个创建于 2769 天前的主题,其中的信息可能已经有所发展或是发生改变。

    能不能给出一些具体的示例来说明一下。网上很多都是长篇大论,却一行代码也没有。

    9 条回复    2017-04-27 18:29:58 +08:00
    csunny
        1
    csunny  
       2017-04-26 20:25:13 +08:00
    感觉这个看示例再多,可能也不如实际工作中碰到体会深刻。
    v1024
        2
    v1024  
       2017-04-26 20:37:29 +08:00 via iPhone   ❤️ 3
    简单来说,高内聚=一个组件相关的东西都在一个目录里,低耦合=组件依赖尽量少
    abcbuzhiming
        3
    abcbuzhiming  
       2017-04-26 22:56:13 +08:00   ❤️ 1
    IOS 的软件就属于典型的高内聚,低耦合,依赖的东西,都装在软件包里,对外没依赖,缺点就是软件体积贼大。反例就是 windows 程序, dll 运行库,彼此高度依赖
    why1
        4
    why1  
       2017-04-26 23:54:04 +08:00 via Android
    cxh116
        5
    cxh116  
       2017-04-27 08:12:48 +08:00 via Android   ❤️ 2
    你的代码能够很方面的写单元测试,就表示已经实现了 高内聚、低耦合
    mazyi
        6
    mazyi  
       2017-04-27 08:36:59 +08:00 via iPhone   ❤️ 1
    @abcbuzhiming 不是把库包含进软件包就是内聚,也不是不依赖外部就是耦合。
    blacklee
        7
    blacklee  
       2017-04-27 08:43:57 +08:00   ❤️ 1
    好了开始上课了。
    但是只有例子没有代码。例子是大家都很熟悉的爬虫。

    高耦合的代码:只有一个模块,以及一种类型的 task。
    这个模块拿到 task,开始下载网页(比如 V2EX 的首页)——解析网页——拿到帖子列表数据

    低耦合的代码:多个模块,多种类型的 task (就是子任务)。
    拿到抽象 task,生成下载网页的 task,交给下载模块。
    下载模块下载完毕,生成解析网页的 task,交给存储模块。
    存储模块拿到数据,自己决定怎么搞。
    abcbuzhiming
        8
    abcbuzhiming  
       2017-04-27 08:53:20 +08:00
    @mazyi 我知道啊,说着玩玩罢了,只不过要形象的解释,那这例子比一般你给人解释,不要依赖具体实现,要面向接口啥的要现实多了,当然实际解释起来也挺麻烦的
    thekll
        9
    thekll  
       2017-04-27 18:29:58 +08:00 via iPhone
    我的理解:高内聚就是内部功能组件尽可能的小和单一,同时避免暴漏不必要的接口;高耦合即尽可能的抽象外部接口,使接口服务和内部实现无关。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:10 · PVG 14:10 · LAX 22:10 · JFK 01:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.