Questions tagged «design»

有关通过软件设计解决问题和计划解决方案的问题。

1
包装第三方代码是否是对用户进行单元测试的唯一解决方案?
我正在进行单元测试,并且在我的一个类中,我需要从一种方法中发送邮件,因此使用构造函数注入,我将注入Zend_MailZend框架中的类的实例。 现在有人认为,如果一个库足够稳定并且不会经常更改,那么就无需对其进行包装。因此,假设这Zend_Mail是稳定的并且不会改变并且完全满足我的需求,那么我就不需要包装器了。 现在看一下我的课程Logger,该课程取决于Zend_Mail: class Logger{ private $mailer; function __construct(Zend_Mail $mail){ $this->mail=$mail; } function toBeTestedFunction(){ //Some code $this->mail->setTo('some value'); $this->mail->setSubject('some value'); $this->mail->setBody('some value'); $this->mail->send(); //Some } } 但是,单元测试要求我一次测试一个组件,因此我需要模拟Zend_Mail该类。另外,我违反了依赖倒置原则,因为我的Logger课程现在依赖于具体而非抽象。 现在,我如何Logger在不进行包装的情况下进行隔离测试Zend_Mail? 该代码在PHP中,但不一定必须提供答案。这更多的是设计问题,而不是特定于语言的功能

4
接口是否应该扩展其他接口(并以此继承方法)
尽管这是一个普遍的问题,但它也特定于我当前遇到的问题。我目前在解决方案中指定了一个接口,称为 public interface IContextProvider { IDataContext { get; set; } IAreaContext { get; set; } } 该接口经常在整个程序中使用,因此我可以轻松访问所需的对象。但是,在程序一部分的较低级别,我需要访问另一个将使用IAreaContext并对其执行一些操作的类。因此,我创建了另一个工厂接口来执行此创建操作: public interface IEventContextFactory { IEventContext CreateEventContext(int eventId); } 我有一个实现IContextProvider的类,并使用NinJect注入。我遇到的问题是,我需要使用此IEventContextFactory的区域只能访问IContextProvider,并且本身使用另一个需要该新接口的类。我不想在低级实例化IEventContextFactory的此实现,而是希望始终使用IEventContextFactory接口。但是我也不想只通过构造函数注入另一个参数,而只是将其传递给需要它的类,即 // example of problem public class MyClass { public MyClass(IContextProvider context, IEventContextFactory event) { _context = context; _event = event; } public void DoSomething() …
13 c#  design  interfaces 

4
视觉和听觉上清晰的拉丁字母子集?
假设您给某人一张卡片,上面印有代码“ 5SBDO0”。 在某些字体中,字母“ S”很难从视觉上与数字5区分开(例如,数字零和字母“ O”)。 大声朗读代码,可能很难区分“ B”和“ D”,必须说“ B代表男孩”,“ D代表狗”或使用“ 语音字母 ”。 在大多数情况下,大声朗读时字母和数字的最大子集是什么? 背景: 我们希望生成一个短字符串,该字符串可以编码尽可能多的值,同时仍易于通信。 假设您有一个6个字符的字符串“ 123456”。在基数10中,这可以编码10 ^ 6个值。 在十六进制“ 1B23DF”中,您可以用相同数量的字符对16 ^ 6个值进行编码,但是当大声读取时,这听起来可能会模棱两可。(“ B”对“ D”) 同样,对于任何N个字符的字符串,您将获得(字母的大小)^ N个值。 由于要很容易地容纳在人类工作记忆容量的范围内,因此该字符串的长度限制为大约六个字符。 因此,要找到我们可以编码的最大值数量,我们需要找到最大的字母/数字明确集合。我们没有理由不考虑字母GZ和一些常见的标点符号,但是我不想手动成对比较“ G听起来像A吗?”,“ G听起来像B吗?”,“是否我自己听起来像C”。我们知道这将是O(n ^ 2)个语言工作=)...
13 design 

8
单一责任原则-我是否过度使用它?
供参考-http://en.wikipedia.org/wiki/Single_responsibility_principle 我有一个测试场景,其中一个应用程序模块负责创建分类帐条目。可以执行三个基本任务: 以表格格式查看现有分类帐条目。 使用创建按钮创建新的分类帐条目。 单击表中的分类帐条目(第一个指针中提到),然后在下一页查看其详细信息。您可以在此页面中使分类帐条目无效。 (每页中有几个其他的操作/验证,但为了简洁起见,我将其限制为这些操作/验证) 因此,我决定创建三个不同的类- LedgerLandingPage CreateNewLedgerEntryPage ViewLedgerEntryPage 这些类提供了可以在那些页面中执行的服务,Selenium测试使用这些类将应用程序带入可以确定某些状态的状态。 当我和一位同事一起对它进行复习时,他感到不安,要求我为所有人开一门课。尽管我仍然觉得自己的设计很干净,但是我是否过度使用单一职责原则还是值得怀疑的

7
设计文件中应包含对给定设计的利弊的讨论,还是应集中于事实和理由?
我目前正在更新设计文档,以使其对未来的开发人员来说是正确的和最新的。 当前,该文档仅关注事实,介绍设计的方式。提出的任何决定都没有理由。我认为,掌握基本原理很重要,这样开发人员才能知道事情为什么如此,因为这很可能会影响未来的决策。对于我来说,不可能为所有设计决策(尤其是在我开始从事该项目之前所做的决策)添加依据,但是我正在本部门尽我所能。 但是,考虑到项目的要求,某些设计决策是非常糟糕的决策。不过,也有一些不错的。 我最初的想法是,我应该讨论设计问题以及针对这些问题的潜在解决方案或变通办法,以引起未来维护者的注意,但是我不确定设计文档是否适合进行此类讨论和提供信息。我不希望其他人在该系统上工作并更新文档时使设计“批判”猛增到“撕毁该设计的新特性”,因为这显然是不合适的。 我的经理会支持任何一个决定,所以这取决于我。无论采用哪种方法,生成的文档都将进行正式版本控制,并通常在执行开发任务之前将其提供给系统上的开发人员。期望新的开发人员在开始开发工作之前先熟悉与给定软件系统相关的文档。 问题: 设计文件应遵循原始事实(“这就是设计”)和基本原理(“这就是设计的原因”)还是应该用于指出设计中可能存在问题的无缺陷问题未来的开发商? 如果不应该使用设计文档来捕获这些信息,那么应该通过讨论设计原理,权衡和已知问题(不是缺陷,因为可以跟踪缺陷)的讨论,应该捕获哪种类型的文档,以及应该捕获什么其他类型的文档?使用其他工具)?

3
应用SOLID原则
我对SOLID设计原则很陌生。我了解它们的原因和好处,但是我未能将它们应用到一个较小的项目中,我想将其重构为使用SOLID原理的实际练习。我知道没有必要更改运行正常的应用程序,但是无论如何我都希望对其进行重构,这样我才能获得未来项目的设计经验。 该应用程序具有以下任务(实际上还有很多任务,但让我们保持简单):它必须读取一个包含数据库表/列/视图等定义的XML文件,并创建一个SQL文件,该文件可用于创建ORACLE数据库架构。 (注意:请不要讨论为什么我需要它或为什么我不使用XSLT等,这是有原因的,但是它们不在主题之列。) 首先,我选择仅查看表和约束。如果忽略列,则可以通过以下方式声明它: 约束是表的一部分(或更准确地说,是CREATE TABLE语句的一部分),并且约束也可以引用另一个表。 首先,我将说明应用程序现在的外观(不应用SOLID): 目前,该应用程序具有“表”类,该类包含表所拥有的约束的指针列表以及引用该表的约束的指针列表。每当建立连接时,也会建立向后连接。该表具有createStatement()方法,该方法依次调用每个约束的createStatement()函数。所述方法本身将使用到所有者表和引用表的连接,以检索它们的名称。 显然,这根本不适用于SOLID。例如,存在循环依赖关系,这些依赖关系根据所需的“添加” /“删除”方法和一些大型对象析构函数使代码膨胀。 所以有两个问题: 我应该使用依赖注入来解决循环依赖吗?如果是这样,我想约束应该在其构造函数中接收所有者(以及可选的被引用)表。但是,如何在单个表的约束列表上运行呢? 如果Table类都存储自身的状态(例如,表名,表注释等)以及到约束的链接,那么考虑“单一职责原则”,这是一个还是两个“职责”? 如果情况2是正确的,我是否应该在管理链接的逻辑业务层中创建一个新类?如果是这样,1.显然不再相关。 应该将“ createStatement”方法作为Table / Constraint类的一部分,还是应该将它们移出?如果是这样,去哪儿?每个数据存储类(例如,表,约束等)一个管理器类?还是为每个链接创建一个管理器类(类似于3)? 每当我尝试回答这些问题之一时,我都会发现自己在某个地方盘旋。 如果您包括列,索引等,问题显然变得更加复杂,但是如果你们帮助我解决简单的Table / Constraint问题,我也许可以自己解决其他问题。

4
异常处理是否是跨领域的关注点?
我对异常处理和日志记录的关注并没有多大区别,因为两者都是跨领域的关注。你怎么看?它不应该单独处理而不是与方法实现的核心逻辑交错处理吗? 编辑:我想说的是,在我看来,方法实现应只包含成功执行路径的逻辑,而异常应在其他地方处理。这与已检查/未检查的异常无关。 例如,一种语言可以通过使用如下结构以完全检查的方式处理异常: class FileReader { public String readFile(String path) { // implement the reading logic, avoid exception handling } } handler FileReader { handle String readFile(String path) { when (IOException joe) { // somehow access the FileInputStram and close it } } } 在上述概念性语言中,程序在没有FileReader 处理程序的情况下将无法编译,因为FileReader 类的readFile不会引发异常。因此,通过声明FileReader 处理程序,编译器可以确保对其进行处理,然后程序可以进行编译。 这样,我们就可以同时处理已检查和未检查的异常问题:健壮性和可读性。

3
依靠参数化查询是防止SQL注入的唯一方法吗?
我对SQL注入攻击的所有了解似乎都表明,参数化查询(尤其是存储过程中的参数化查询)是防范此类攻击的唯一方法。在我工作的时候(回到黑暗时代),存储过程被认为是一种不好的做法,主要是因为它们的可维护性较差。可测试性较低;高度耦合;并将系统锁定在一个供应商中;(此问题涵盖其他一些原因)。 尽管在我工作时,项目实际上并没有意识到这种攻击的可能性。采用了各种规则来保护数据库免受各种损坏。这些规则可以概括为: 没有客户端/应用程序可以直接访问数据库表。 对所有表的所有访问都是通过视图进行的(对基本表的所有更新都是通过触发器进行的)。 所有数据项都有指定的域。 不允许任何数据项为空-这意味着DBA有时会磨牙。但被执行了。 角色和权限已适当设置-例如,受限制的角色仅授予视图更改数据的权利。 那么,这样的一组(强制)规则(尽管不一定是特定的一组)是否可以替代参数化查询,以防止SQL注入攻击?如果没有,为什么不呢?可以通过(仅)数据库特定措施来保护数据库免受此类攻击吗? 编辑 鉴于收到的初步答复,对该问题的重视程度略有变化。基本问题不变。 编辑2 依赖参数化查询的方法似乎只是防御系统攻击的外围步骤。在我看来,更基本的防御措施既可取,又可能使对此类查询的依赖变得不必要或不太关键,甚至可以专门防御注入攻击。 我的问题中隐含的方法基于“加固”数据库,我不知道它是否是可行的选择。进一步的研究表明存在这样的方法。我发现以下来源提供了一些指向这种方法的指针: http://database-programmer.blogspot.com http://thehelsinkideclaration.blogspot.com 我从这些来源获得的主要特征是: 广泛的数据字典,与广泛的安全数据字典相结合 从数据字典生成触发器,查询和约束 最小化代码并最大化数据 尽管我到目前为止所获得的答案非常有用,并指出了忽略参数化查询所带来的困难,但最终它们并没有回答我的原始问题(现在以粗体强调)。

7
开发方法:用户界面输入或域模型输出?
尽管我从未使用Smalltalk交付过任何东西,但我短暂的使用时间肯定已经留下了印记。描述体验的唯一方法是按原样应有的MVC。本质上,对您的应用程序而言,所有繁重的工作都是在业务对象中完成的(如果您愿意,也可以在域模型中完成)。标准控件以某种方式绑定到业务对象。例如,一个文本框被映射到一个对象的字段(该字段本身是一个对象,因此很容易做到)。一个按钮将映射到一个方法。所有这些都是通过非常简单自然的API完成的。我们不必考虑绑定对象等。它可以正常工作。 但是,在许多更新的语言和API中,您不得不从外部进行思考。首先使用C ++和MFC,现在使用C#和WPF,Microsoft已将其开发人员吸引到GUI生成器上,在其中可以通过实现事件处理程序来构建应用程序。Java Swing开发并没有什么不同,只有您自己编写代码以实例化表单上的控件。对于某些项目,甚至可能永远都没有域模型-只是事件处理程序。我的大部分职业都在使用该模型。 每种方式都会迫使您以不同的方式思考。使用Smalltalk方法,您的域很聪明,而GUI却很笨。使用默认的VisualStudio方法,您的GUI会很聪明,而域模型(如果存在)则很贫乏。 与我合作的许多开发人员看到了Smalltalk方法的价值,并试图将这种方法引入VisualStudio环境。WPF具有一些动态绑定功能,这使其成为可能。但是有局限性。不可避免地,属于域模型的某些代码最终会出现在GUI类中。 那么,您采用哪种方式设计/开发代码?为什么? GUI首先。用户交互至关重要。 域优先。在我们将UI放到系统上之前,我需要确保系统是正确的。 两种方法都有优点和缺点。Domain模型适合在那里放置水晶大教堂和空中馅饼。GUI非常适合快速且肮脏的(有时确实很肮脏)。 还有一个额外的好处:如何确保代码可维护?

5
艾伦·库珀的统一文件模型发生了什么?
长期以来,Alan Cooper(在他的《 About Face》一书的3个版本中)一直在推广“统一文件模型”,以免除他所说的有史以来最愚蠢的消息框-一个点击应用或表单上的关闭按钮并显示“您要放弃所做的更改?”时弹出。我喜欢这个主意和他的观点,但也有大多数经验丰富的程序员和用户对此的直率反应。 尽管库珀的书似乎很受人们欢迎和尊重,但我在网上找不到关于这个特定问题的讨论,很少。“编程工业强度Windows”的作者Petter Hesselberg提到了这一点,但似乎是这样。 我有机会在我正在从事的(桌面)项目中实现此目标,但是客户和同事当然会遇到阻力,他们当然熟悉MS Word和Excel的工作方式。我可以推翻他们的反对意见,但是不确定是否应该这样做。 我的问题是: 我没有找到对此的良好讨论?有人在他们的应用程序中这样做吗?一个好主意是,不幸的是,要等到Microsoft才实施,它才是不现实的?

4
“通知中心”模式是否会鼓励程序设计的好坏?
有时我遇到这些消息中心式的API,例如Cocoa NSNotificationCenter:http : //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html 通常,这些API提供您在其上订阅或广播消息/事件的全局访问点。我认为这是一个问题,因为它鼓励使用扁平且非结构化的程序体系结构,其中的依赖关系在API中不是显式的,而在源代码中则是隐藏的。您不必考虑对象的所有权和层次结构,而可以使程序中的任何对象导致在任何地方调用任何代码。但这也许是一件好事吗? 这种模式通常会鼓励程序设计的好坏,为什么呢?它会使代码更难或更容易测试吗? 如果这个问题太模糊或太宽泛,请原谅我。我正在努力避免像这样大量使用API​​的潜在后果以及使用它的不同方式。 编辑:我猜想我最大的问题是这种API依赖于依赖关系和对象耦合,并且可以通过以下示例进行说明: myObj = new Foo(); myOtherObj = new Bar(); print myOtherObj.someValue; // prints 0 myObj.doSomething(); print myOtherObj.someValue; // prints 1, unexpectedly, because I never indicated that these objects had anything to do with each other

1
根据语法编写词法分析器时应遵循的步骤是什么?
在阅读有关语法,词法分析器和语法分析器的澄清问题的答案时,答案指出: BNF语法包含词法分析和解析所需的所有规则。 这对我来说有点奇怪,因为直到现在,我一直认为词法分析器根本不基于语法,而解析器则很大程度上基于语法。在阅读了许多有关编写词法分析器的博客文章之后,我得出了这个结论,而从来没有人使用1 EBNF / BNF作为设计基础。 如果词法分析器以及解析器都基于EBNF / BNF语法,那么如何使用该方法创建词法分析器呢?也就是说,如何使用给定的EBNF / BNF语法构造词法分析器? 我见过很多,很多的职位,应对写的用EBNF / BNF作为指导或蓝图解析器,但我已经遇到没有到目前为止,显示与词法分析器的设计相当。 例如,采用以下语法: input = digit| string ; digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; string = '"', { all characters - '"' …

4
将数据值硬编码到程序中是否有优势?
我是一个自学成才的新手程序员,因此,如果我不喜欢程序员的话,我深表歉意。 我正在从事一个项目,在该项目中,我将向开发人员提供不断更新的数据,这些开发人员实际上将创建一种工具,用于根据对数据的查询生成报告。 似乎每个参与人员都认为他们需要将数据值(不是模式,而是域/值本身)硬编码到报告生成程序中。 例如,假设我们正在报告人员情况;该报告将分为几类,每个部门都有一个标题,然后在每个部门标题下将是职务的子标题,然后在每个子标题下将是雇员列表。开发人员希望对部门和职位进行硬编码。另一方面,我认为他们可以/将在运行时查询这些事情,对它们进行排序,并根据存在的值动态生成报告标题。 由于潜在价值的列表将随着时间而变化(例如,将创建/重命名部门,将添加新的职务),因此需要不断更新代码。在我看来,我们可以跳过代码维护步骤,并动态组织报告。 由于我不是开发人员,所以我想知道自己缺少什么。将值硬编码到这样的工具中可能有什么优势?这通常是程序的设计方式吗?

6
什么是最简单的人类可读配置文件格式?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 当前配置文件如下: mainwindow.title = 'test' mainwindow.position.x = 100 mainwindow.position.y = 200 mainwindow.button.label = 'apply' mainwindow.button.size.x = 100 mainwindow.button.size.y = 30 logger.datarate = 100 logger.enable = True logger.filename = './test.log' 使用python将其读取到嵌套字典中: { 'mainwindow':{ 'button':{ 'label': {'value':'apply'}, ... }, 'logger':{ datarate: {'value': 100}, enable: {'value': True}, filename: {'value': './test.log'} }, …

5
寻找最适合圈子的人
下面是一个示例图像,如果我在中间有一个白点,并且我想找到所有可能存在的红色圆圈,则该蓝色圆圈的位置可能最近(显然是我放置它的位置) 。如何找到该位置? 对我来说,性能并不是此应用程序的主要问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.