适合初学者的松耦合和面向对象实践

2024-01-20

保持类松散耦合是编写易于理解、修改和调试的代码的一个重要方面——我明白了。然而,作为一个新手,几乎任何时候我都很难超越最简单的例子。

我或多或少地了解如何将字符串、整数和简单数据类型封装在它们自己的类中。然而,当我开始处理富文本格式等信息时,事情变得非常复杂——除非我只使用组件中已有的各种方法。为了继续这个示例,假设我正在编写一些在 UI 中包含 RTF 备忘录组件的内容。在 Delphi 中,该组件具有用于执行诸如保存格式化文本之类的操作的内置方法。此外,有时似乎处理 RTF 文本本身的唯一(或至少是最佳)方法是通过再次内置于组件中的方法。

当我已经有一个可以为我完成所有这些工作的组件时,如何(或为什么)在另一个类中完成所有保存、加载和格式化文本的工作?

就我自己而言,我通常最终要么(a)做一些看起来比需要复杂得多的事情,重新发明已经存在的方法,要么(b)创建仍然彼此紧密耦合的做得很差的类。正如他们在电视广告中所说,“必须有更好的方法!”

我只是在概念上迷失了“更好的方式”如何运作。有什么想法吗?


我相信您错过了一些基本概念。

背后的想法OOP http://en.wikipedia.org/wiki/Object-oriented_programming从离散的、可重用的逻辑单元开始。重点是创建自给自足的模块。

对于 RTF Memo 组件,它通过处理给定的数据集(备忘录)来满足上述条件,这样您的程序和程序中的其他对象就不会关心它如何工作。它的目的是显示界面、接受数据、操作特定数据并将该数据传递到程序的另一部分。

存在背后的想法松耦合 http://en.wikipedia.org/wiki/Loosely_Coupled简单地说,您可以用另一个满足相同接口规范的控件替换该备忘录控件。也就是说,您可以实例化它,让用户与其交互,并在必要时提取数据。

松散耦合与以下想法齐头并进关注点分离 http://en.wikipedia.org/wiki/Separation_of_concerns(系统芯片);这是将程序分解为不同功能的过程,以减少功能重叠并使其更易于管理。但它们不是同一件事。顺便说一句,这也是从过程式编程风格转向 OOP 的主要驱动力之一。由于 OOP 迫使编程根据相关和离散的功能进行思考。

听起来你真的在问SoC。

实现SoC的方法有很多种。有时,它涉及将 UI、处理逻辑和持久层分开(例如考虑 MVC 设计模式)。有时只是将相关功能放在一起以降低复杂性; RTF 控件已经通过包含操作数据所需的所有函数来实现这一点,这样您就不再有进一步的依赖性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适合初学者的松耦合和面向对象实践 的相关文章

  • 工厂中的依赖注入

    我对 DI 很陌生 但我真的很想尝试使用它 有件事我不明白 这是一个简单的工厂伪代码 我经常使用 class PageFactory public function construct dependency list save refere
  • Python 面向对象编程:组合

    我一直在学习如何在 python 编程中实现组合 但我很难理解为什么它比继承更受欢迎 例如 到目前为止 这是我的代码 class Particle Constructor public def init self name charge r
  • 反射真的那么慢以至于我不应该在有意义的时候使用它吗? [复制]

    这个问题在这里已经有答案了 可能的重复 NET 反射的成本有多高 https stackoverflow com questions 25458 how costly is net reflection 优雅 的解决方案problem ht
  • 为什么java中的嵌套类与C#中的嵌套类在以下方面有所不同?

    我发现了一些类似的帖子 但找不到明确解释这一点的答案 我已经执行了类的嵌套 即 内部 类存在于 外部 类中 并尝试实例化内部类 这就是我遇到的场景 如果是 C class outside public class inside public
  • 在枚举的构造函数中访问其他枚举

    我需要类似下面的东西 enum EE A anything B beta Z zulu ALL EE String s this s s EE String s for EE ee values PROBLEM HERE if ee ALL
  • Erlang 参与者与 OOP 对象有何不同?

    假设我有一个 Erlang actor 定义如下 counter Num gt receive From increment gt From self new value Num 1 counter Num 1 end 同样 我有一个 Ru
  • 哪个类应该存储查找表? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 世界上有不同地点的代理 但任何地点都只有一个代理 每个特工都知道他在哪里 但我还需要快速检查给定位置是否有特工 因此 我还维护了一张从位置到代理
  • 可以在子例程中使用模块吗?

    最近 我开始使用 OO Perl 并且为我正在开发的新项目创建了很多新对象 因为我不熟悉有关 OO Perl 的任何最佳实践 所以我们很急于完成它 P 我将大量此类代码放入每个函数中 sub funcx use ObjectX i don
  • 将我的数据库类与项目中的其他类一起使用

    我有一个自己编写的自定义数据库类 还有一个用户类和一个站点类 MySQL 类有这样的方法 connect query clean fetch 用户等级 register login logout resetPass 站点类别 updateT
  • UML三元关联实现java代码[重复]

    这个问题在这里已经有答案了 三元关联是结构关系 指定一个事物的对象连接到其他两个事物的对象 我理解这种关系 但我不知道如何实现显示这三个类之间关联的方法 让我们考虑下面的例子 项目有许多使用特定编程的开发人员 语言促进发展 开发人员使用特定
  • 如何区分类实现中两个协议的相同方法名称?

    我有两个协议 protocol P1 void printP1 void printCommon end protocol P2 void printP2 void printCommon end 现在 我在一个类中实现这两个协议 inte
  • 使用 OOP 开发 WordPress 插件

    我是插件开发的新手 所以 凡是我说得不对的地方 请大家指正 我有一个网站需要一个具有以下需求的播放器插件 管理员可控的玩家注册表单 其中包含一些详细信息 显示所有注册玩家的列表页面 已注册的玩家可以删除并相互比较 在前端的 WordPres
  • 处理在没有全局变量的情况下跨函数使用的变量

    所以我正在开发一个基本的文字游戏 你会得到一只字母 手 字典对象 你可以用它来创建单词并获得分数 这个 手牌 被用在许多函数的参数中 计算玩家的分数 在玩家使用一个或多个字母后更新手牌中的字母数量 显示手牌 检查玩家单词的有效性 ETC 从
  • 静态类属性上的 isset

    class A public static foo 42 class A attribute foo var dump isset class attribute gives bool false 我如何检查这个类中是否存在这个静态属性 U
  • 我应该如何使用 Perl URI 类?

    我需要在 Perl 程序中处理一些 HTTP URL 但我怀疑应该如何处理URI https metacpan org module URI类帮助我 特别是 我想使用URI用于解析相对 URL 并获取其组件的类 然而 问题是 我需要一个可以
  • PHP - 多个不同的数据库依赖注入类

    我花了过去几个小时试图找到 最佳 最合乎逻辑的方法的答案 以编写一个 php 数据库类以同时连接到一个 postgresql 数据库和一个 mysql 数据库 另外 我想采用依赖注入设计 但对整个概念还是陌生的 到目前为止我已经想出了 cl
  • 如何动态构造方法?

    我设计了一个类 它非常标准 具有一些方法属性 class foo def f1 self print f1 def f2 self print f2 def fn self print fn 现在我想创建一个包含一组 foo 实例的类 cl
  • ASP.NET/ADO.NET:处理 .NET 对象内的许多数据库连接?

    我们有一个 NET 对象 它对数据库进行大量读 写操作 在该对象 或使用它的 ASP 页 的整个生命周期中 它可能会通过查询 更新来访问数据库 1 到 10 次 它不是在每次对象需要访问数据库时打开和关闭数据库连接 而是只是在实例化期间打开
  • Python Tkinter OOP 布局配置

    我正在尝试使用 tkinter 构建一个应用程序 该布局在没有 OO 原则的情况下工作 但我很难理解应该如何将其转移到 OO The layout is as shown in the pic below 1280x720px 我有以下内容
  • Mootools 使用“extend”方法扩展“Function”类,导致 jQuery 无法使用

    Mootools 扩展了 Function 类 并在其中添加了一个名为 extend 的新方法 现在 jQuery 尝试使用 jQuery prototype extend 添加 扩展 功能 然而 由于 extend 已经是 jQuery

随机推荐

  • HtmlTable 和 TagBuilder("table") 之间的区别

    只是想知道这两者之间有什么区别 以及当我在 HtmlHelper 中构建表格时 其中一个或另一个有什么好处 HtmlTable table new HtmlTable and TagBuilder table new TagBuilder
  • 如何更改 Ant 表头复选框

    我的应用程序中有一个表 我在其中对每一行使用 select 当我单击并选择行时 左上角会出现一个选中的复选框 我不想显示该复选框 我想显示其他内容 例如带有文本的 div 仅当我单击一行中的复选框时 该 div 才会出现 这个怎么做 我试图
  • 使用共享代码分离前端和后端的 package.json

    我有一个项目 有一个单独的前端 webpack 和后端 express mongodb 我想分开 the package json同时即将在它们之间共享一些逻辑 实用代码 我如何组织我的文件结构 以便我可以适当地分离它们的依赖关系 现在这是
  • 从 edmx 模型生成 odata 类

    我正在尝试在另一个 ODATA API 的代码中使用来自现有 ODATA 端点的数据 我不想手动重新创建所有模型 因此我希望使用现有的 edmx 模型在 C 中创建我需要的类 我研究了 Microsoft 提供的 odata 客户端代码生成
  • 为此获得提升::shared_ptr

    我正在广泛使用boost shared ptr在我的代码中 事实上 大多数分配在堆上的对象都由一个shared ptr 不幸的是 这意味着我无法通过this进入任何需要一个函数shared ptr 考虑这段代码 void bar boost
  • Checkstyle - 仅检查接口中的方法

    是否可以仅对接口中的方法应用 JavadocMethod 检查器 不在实现类中 我们也有计划实施 敬请关注issue https github com sevntu checkstyle sevntu checkstyle issues 7
  • CDK将API网关堆栈分成2个小堆栈

    我正在尝试创建一个 CDK 堆栈来创建 API 网关 如果我以 小块 形式创建堆栈 资源的注释部分 则一切都会正常工作 但是当我尝试创建完整的堆栈时 我收到此异常 Number of resources 224 is greater tha
  • 为 Mac 编译 stasm

    我正在尝试在我的 mac 上构建 stasm 库 并希望将其移植到 iphone 上 斯塔姆下载 http www milbo users sonic net stasm download html http www milbo users
  • 使用 Eclipse Juno Java EE 进行 jQuery 自动补全

    我已经阅读了一些关于如何为 Eclipse 启用 jQuery 特别是自动完成 支持的日期信息 使用 Aptana 或其他插件 我尝试过 Aptana 3 版本插件 但除了问题之外什么也没得到 有人可以解释如何实现这一目标吗 也许现在 Ap
  • PageControl 禁用选项卡上的文本 - 灰色文本

    我正在寻找 我认为 可以在 TPageControl 组件的 OnDrawTab 事件中使用的 Windows API 以在我选择的选项卡上显示灰色文本 我过去曾经这样做过 根据记忆 这就是我所做的 在 OnDrawTab 事件中 不幸的是
  • 有没有办法对 Firebase 用户创建和/或密码重置进行电子邮件确认?

    问题说明了一切 在 Firebase 中 当用户创建帐户时如何确认电子邮件 或者通过电子邮件重置密码 我可以更广泛地问 有什么方法可以从 Firebase 发送电子邮件吗 例如 通知等 这不是您通常在客户端执行的操作 Update 请注意
  • 在 Visual Studio 2010 中更改文本光标/插入符号

    我不小心将 Visual Studio 2010 中的文本光标 插入符号从一行更改为带有突出显示整个字符的框的光标 但不知道如何将其更改回来 谁能告诉我怎么做 谢谢 按插入键
  • 如何将可观察集合写入txt文件?

    将可观察集合写入 txt 文件的最佳方法是什么 我目前有以下内容 public ObservableCollection
  • pytqt图形线的鼠标坐标

    每当我将鼠标移动到图表顶部时 我都试图获取随机函数图的 x y 值 我正在使用 pyqtgraph SignalProxy 并将其连接到回调 mousedMoved 我收到此错误 NameError 未定义全局名称 mouseMoved 这
  • 在 Play 2.x 中覆盖 WebJar 资源

    只是想知道 是否有一种方法可以在一个文件中覆盖某些资产 确切地说是 JS 和 LESS 文件WebJars http www webjars org 资产与位于app assets 目录 说吧 我有一个引导程序 3 1 1 webjar h
  • 将 Matplotlib 图形保存为全屏图像

    我正在使用 Pandas 和 MatPlotLib 构建一个小型图形实用程序来解析工作机器中的数据和输出图形 当我使用输出图表时 plt show 我最终得到了一个不清晰的图像 其中的图例和标签就像这样相互排斥 However expand
  • 无法使用 pip 安装 Python 成像库

    尝试使用 PIP 安装 Python Imaging Library PIL 时 安装失败并出现以下错误 SyntaxError invalid syntax Complete output from command python setu
  • 没有找到类“androidx.core.widget.DrawerLayout”

    使用 Android Studio 菜单选项 Refactor gt Refactor to Androidx 迁移到 Androidx 包后 我的 build gradle 看起来像 implementation androidx app
  • facebook graph api 和 php sdk,删除事件!

    在我的一生中 我找不到一种方法来删除 取消或移除我使用 FB PHP SDK 和 Graph API 创建和更新的 Facebook 事件 我已经尝试了 facebook 文档和堆栈溢出中找到的每一个排列 以下是我在探索中发现的一些线索 h
  • 适合初学者的松耦合和面向对象实践

    保持类松散耦合是编写易于理解 修改和调试的代码的一个重要方面 我明白了 然而 作为一个新手 几乎任何时候我都很难超越最简单的例子 我或多或少地了解如何将字符串 整数和简单数据类型封装在它们自己的类中 然而 当我开始处理富文本格式等信息时 事