一些可重用代码的架构

2024-01-17

我正在编写一些小型、简单的应用程序,它们共享一个共同的结构,并且需要以相同的方式做一些相同的事情(例如日志记录、数据库连接设置、环境设置),并且我正在寻找一些构建这些应用程序的建议可重复使用的组件。该代码是用强静态类型语言编写的(例如 Java 或 C#,我必须用这两种语言来解决这个问题)。目前我得到了这个:

abstract class EmptyApp //this is the reusable bit
{
   //various useful fields: loggers, db connections

   abstract function body()
   function run()
   {
        //do setup
        this.body()
        //do cleanup
   }
}

class theApp extends EmptyApp //this is a given app
{
   function body()
   {
        //do stuff using some fields from EmptyApp
   }

   function main()
   {
        theApp app = new theApp()
        app.run()
   }
 }

有没有更好的办法?也许如下?我很难权衡利弊...

abstract class EmptyApp
{
     //various fields
}

class ReusableBits
{
    static function doSetup(EmptyApp theApp)

    static function doCleanup(EmptyApp theApp)
}

class theApp extends EmptyApp
{
    function main()
    {
         ReusableBits.doSetup(this);
         //do stuff using some fields from EmptyApp
         ReusableBits.doCleanup(this);
    }
}

一个明显的权衡是,使用选项 2,“框架”无法将应用程序包装在 try-catch 块中......


我一直赞成通过组合(您的第二个选择)而不是继承(您的第一个选择)来重用。

仅当类之间存在关系时才应使用继承,而不是为了代码重用。

因此,对于您的示例,我将有多个 ReusableBits 类,每个类执行每个应用程序在需要时使用的一件事。

这允许每个应用程序重复使用与该特定应用程序相关的框架部分,而不必被迫采用所有内容,从而允许各个应用程序更加自由。如果您将来的某些应用程序不完全适合您今天所考虑的结构,那么通过继承进行重用有时会变得非常具有限制性。

如果您将框架分解为单独的实用程序,您还会发现单元测试和测试驱动开发变得更加容易。

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

一些可重用代码的架构 的相关文章

  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等
  • 在运行时选择模板参数时如何避免代码呈指数级增长

    考虑一堆基本类型 Foo 所有这些都具有通用方法的独特实现 Bar 我可以结合Foo1 Foo2 Foo5像这样 CombinedFoo
  • UserDict 类的优点?

    使用有什么好处UserDict class 我的意思是 我真正得到的不是 class MyClass object def init self self a 0 self b 0 m MyClass m a 5 m b 7 我将写下以下内容
  • 就MVC模式而言,Struts 2中使用的Action是什么?

    在Struts2中 控制器将请求分派给Action Action将其传递给后端逻辑 这可以看作是一个非常大的过程 model 处理请求 JSP代表视图 Struts2中如何定义Action 肯定是not一个看法 是控制器还是模型 Strut
  • 在 Ext JS 构造函数中将项目推入数组会产生多个项目

    我有一个我定义的 Ext JS 类 在这个班级的constructor 我将一个文本字段推送到我的项目数组上 然后添加到我的测试字符串中 数组和字符串在类定义中都声明为空 但是 如果您尝试创建多个类实例 您将看到项目数组在每个实例之间共享
  • 如何在 PHP 中检查特定类型的对象

    我有一种方法 它接受 PDO 对象作为参数 允许用户使用现有连接 而不是打开新连接的方法 并节省资源 public static function databaseConnect pdo null 我知道is object 检查参数是否是一
  • 为什么 'self.self' 在 swift 中编译并运行?

    昨天我回顾了 Swift 中的一段代码 其中包括这一行 self self someProperty 这让我很惊讶 因为这个词self被保留并用作对当前实例的引用 起初我用其他语言检查了这种现象 但都给出了错误 这并不奇怪 但是 为什么它能
  • 依赖注入系统中的事件朝哪个方向发展?

    上或下 我是一个非常注重视觉的人 我将我的应用程序视为一个层次结构 顶部是根 底部是叶子 我还了解到 在 DI 系统中 容器不知道其所包含对象的职责 功能 相反 所包含的对象知道它们的上下文 因为上下文 依赖项 被注入 UP 非 DI 方式
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 您的 Web 服务版本控制最佳实践是什么?

    我们有 2 个独立的产品 需要通过 Web 服务相互通信 支持 API 版本控制的最佳实践是什么 I have 本文 http www ibm com developerworks webservices library ws versio
  • 列出某个类的所有对象

    好的 我的问题如下 我有一个用这个构造函数描述宠物的类 public function construct name type age 所以我想做的是制作一些宠物对象 然后我想打印这个类的所有对象的所有属性 这样它看起来像this http
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”是什么?

    假设我有一个 NET 富客户端 WPF 应用程序 它将同时部署在 3 个不同的场景中 客户端和服务器代码在单个进程中运行 客户端代码在 Intranet 计算机上运行 并通过 WCF 与运行应用程序 域 基础设施代码的服务器计算机进行通信
  • 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?

    在我的应用程序中 我有这样的内容 user ts export class User 现在 我这样做 应用程序组件 ts callAnotherFunction User 如果我将类名作为字符串 即 我该如何做到这一点 User 如果可能的
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto
  • 树的递归和非递归过程

    我们知道树是递归数据结构 我们在编写树的过程中使用递归 例如BST的删除方法等 递归的好处是 我们的程序变得非常小 例如中序遍历的代码只有4或5行 而不是非递归程序 虽然会很长 但从理解的角度来看 不像递归程序那么复杂 这就是为什么我讨厌递
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 过程式编程与 OOP 的开发成本?

    我有相当深厚的 OO 背景 OOD 和 OOP 的好处对我来说是第二天性 但最近我发现自己在一家与过程编程习惯相关的开发商店 实现语言具有一些 OOP 功能 但它们没有以最佳方式使用 更新 每个人似乎对这个话题都有自己的看法 我也是如此 但

随机推荐

  • 受保护的构造函数和可访问性

    如果子类位于不同的包中 为什么我们不能使用受保护的构造函数实例化一个类 如果可以访问受保护的变量和方法 为什么相同的规则不适用于受保护的构造函数 pack1 package pack1 public class A private int
  • 此处不应引用 Java 方法

    究竟如何使用 Java 8 链接实例的方法引用 例子 Collections sort civs Comparator comparing Civilization getStrategy getStrategLevel getStrate
  • 为什么继承的接口无法在通用上下文中转换为其基接口?

    我正在尝试在我的 C 项目中实现接口继承系统 但无法让它工作 这是一个简化版本 public interface BaseInterface public abstract class AbstractClass
  • UITableView 检测选定的单元格?

    我的应用程序中有多个 UITableView 是否有一种方法可以检测用户在该列中选择了哪个单元格 行 还可以通过编程方式取消选择单元格 行吗 Thanks 获取表当前选择的索引路径 NSIndexPath path tableView in
  • Magento 将控制器复制到本地

    当我复制一些core Mage Adminhtml Block 文件到local Mage Adminhtml Block 一切正常 但如果我将控制器复制到local Mage Adminhtml controllers 核心控制器仍然有效
  • 一对一的聊天记录,包括开火和打拳

    我已经在我的系统中安装了 open fire 通过使用邮递员工具我可以创建用户 通过使用 smack 我也可以将消息发送给其他用户 但问题是我不知道如何获取两个用户之间的聊天历史记录 这意味着如果我发送发件人和收件人用户名 我需要获取以前的
  • Javascript 中的简单 HTML 清理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用 JavaScript 编写的简单 HTML 清理程序 它不需要 100 XSS 安全
  • CAShapeLayer 路径弹簧动画不“过度”

    我正在尝试使用 CASpringAnimation 对 CAShapeLayer 路径进行动画处理 预期的结果是形状之间的 变形 表现出 弹性 我有一个圆形和方形路径之间的基本代码示例 如下所示 但最终结果是一个弹簧动画 它不会 超出 最终
  • 如何让tinymce默认以纯文本粘贴

    谷歌搜索了数千次 没有人给出如何让 Tinymce 默认粘贴纯文本并在不单击 粘贴为文本 按钮的情况下删除任何格式的完整解决方案 关于如何实现它有什么想法吗 或者如何自动启用 粘贴为文本 按钮 谢谢 对于tinyMCE 3X 或4X 来说
  • 分割 html 标签

    div Hi HElP ME br p ok p p p div img class div b ok1 b div img class div p end p p p b b div I want to split this html c
  • 按 Enter 键退出 while 循环而不阻塞。我该如何改进这个方法?

    因此 我一直在阅读有关如何通过用户按 Enter 键退出 while 循环的一些内容 并得出以下结论 import sys select os switch 1 i 1 while switch 1 os system cls if os
  • 在选择选项中显示图像以供选择 -Django Python

    我正在开发一个项目 但我被困在订单页面上 在这里 我想在选项标签中显示产品图像列表 以便用户可以从所有图像中选择一张图像 或者可以上传图像 上传图像的功能正常工作 但选择不起作用 我想向用户显示图像 以便用户可以选择其中一张 模型 py c
  • javascript 输入只允许数字

    我使用这个代码并且它有效
  • 如何在 Javascript 中单击 标记时切换(隐藏/显示)表格

    我想显示和隐藏 切换 table onClick事件的 a 这是我的 a tag a href Login a 这是我的 Javascript 函数toggleTable hide a a table
  • 如何使用 Html.TextBoxFor 设置默认值?

    简单的问题 如果您使用 ASP NET MVC Framework 1 中的 Html Helper 则很容易在文本框上设置默认值 因为存在重载Html TextBox string name object value 当我尝试使用Html
  • ListView中自定义onInterceptTouchEvent

    我如何实现自定义onInterceptTouchEvent in a ListView给孩子的滚动优先权ListView一旦他们完成滚动 就将其返回给ListView 我想优先考虑内心的观点 尝试覆盖onInterceptTouchEven
  • 使用 WorkManager 的定期工作请求不起作用

    我正在尝试编写一个定期的 Workmanager 脚本 但它只是在我打开应用程序时运行 并且只运行一次 不是定期的 这是我的主要活动 public class MainActivity extends AppCompatActivity O
  • 为什么这个输入与另一个输入重叠?

    我在 Python 2 7 10 中创建了一个 TCP 服务器 一旦我输入我的用户名 它就会询问密码 而不是说 用户名 管理员 密码 管理员 it says 用户名 管理员 密码 昵称 昵称是密码后输入的 这是相关代码 def userna
  • 哪些 C++ 编译器已经支持 lambda?

    是否有 C 编译器已经支持C 0x http en wikipedia org wiki C 2B 2B0x lambda http en wikipedia org wiki Lambda calculus表达式 Visual Studi
  • 一些可重用代码的架构

    我正在编写一些小型 简单的应用程序 它们共享一个共同的结构 并且需要以相同的方式做一些相同的事情 例如日志记录 数据库连接设置 环境设置 并且我正在寻找一些构建这些应用程序的建议可重复使用的组件 该代码是用强静态类型语言编写的 例如 Jav