Questions tagged «design»

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

4
组件和模块之间有区别吗
我对术语模块和组件有一些疑问。在我看来,模块是捆绑的类,只能通过定义明确的接口访问。它们隐藏了所有实现细节,并且可以重用。模块定义了它们所依赖的模块。 组件有什么区别?我在一些书中进行了查找,但是组件的描述非常相似。

8
前端优先或后端优先。这两个是好的系统设计实践?
我现在有一个客户,要求我开发学校注册系统。现在,这是我第一次遇到这种挑战。我创建的大多数过去的软件都没有那么复杂。 我知道你们大多数人都已经创建了复杂的软件,我只想就此提出建议。我应该先设计前端还是后端? 谢谢! 这是我前一段时间在互联网上找到的一篇文章的结论。只想分享 http://www.skitoy.com/p/front-end-vs-back-end-developers-my-take/157 前端与后端开发人员(我的看法) 我个人的看法 同样,这是一个培训问题,一些广泛的笔画概括: 前端开发人员 通常没有CS学位,或者没有三级学校的CS学位。 使用与基本语言类似的语言(请参阅PHP是基本语言) 具有将photoshop文档转换为CSS / HTML / etc的视觉技巧。 由于使用无类型语言,因此对迭代编程具有较高的容忍度 后端开发人员 有CS学位或丰富经验 在他们的问题解决方法上趋向于我 不要介意花几天时间寻找一个正在泄漏的物体 尝试构建工具来解决问题

6
您可以在没有class关键字的情况下实现“面向对象”编程吗?
假设我们要提供银行“帐户”的抽象。这是function在Python中使用对象的一种方法: def account(): """Return a dispatch dictionary representing a bank account. >>> a = account() >>> a['deposit'](100) 100 >>> a['withdraw'](90) 10 >>> a['withdraw'](90) 'Insufficient funds' >>> a['balance'] 10 """ def withdraw(amount): if amount > dispatch['balance']: return 'Insufficient funds' dispatch['balance'] -= amount return dispatch['balance'] def deposit(amount): dispatch['balance'] += amount return dispatch['balance'] …

6
了解“编程接口”
我遇到过很多术语“编程为接口而不是实现”,我想我有点理解它的意思。但是我想确保我了解它的好处以及可能的实现。 “对接口进行编程”意味着,在可能的情况下,应该引用一个类的更抽象级别(一个接口,抽象类,有时甚至是某种超类),而不是引用一个具体的实现。 Java中的一个常见示例是使用: List myList = new ArrayList();代替ArrayList myList = new ArrayList();。 我对此有两个问题: 我想确保我了解这种方法的主要好处。我认为好处主要是灵活性。将对象声明为更高级的引用,而不是具体的实现,可以在整个开发周期和整个代码中提供更大的灵活性和可维护性。它是否正确?灵活性是主要好处吗? 还有更多的“编程接口”方法吗?还是“将变量声明为接口而不是具体的实现”是此概念的唯一实现? 我不是在谈论Java构造接口。我说的是OO原则:“编程为接口,而不是实现”。按照这个原理,世界“接口”是指一个类的任何“超类型” -接口,抽象类或简单的超类,它比更具体的子类更抽象,更不具体。

7
“数据隐藏”和“封装”有什么区别?
我正在阅读“实践中的Java并发性”,有人说:“幸运的是,相同的面向对象技术可以帮助您编写组织良好,可维护的类(例如封装和数据隐藏),也可以帮助您创建线程安全的类。” 问题#1-我从未听说过数据隐藏,也不知道它是什么。 问题2-我一直认为封装使用的是私有vs公共,实际上是在隐藏数据。 您能否解释一下什么是数据隐藏以及它与封装有何不同?

12
有用的错误消息会给开发人员带来什么问题?[关闭]
至今令我震惊的是,在如今的今天,由专业团队开发的至今仍在使用多年的产品一直未能提供给用户有用的错误消息。在某些情况下,仅添加少量额外信息就可以节省用户数小时的麻烦。 产生错误的程序,是有原因的。它拥有一切可用的信息,可以尽一切可能地通知用户,为什么会失败。但是,提供信息以帮助用户的优先级较低。我认为这是一个巨大的失败。 一个示例来自SQL Server。当您尝试还原正在使用的数据库时,它绝对不会让您这样做。SQL Server 知道哪些进程和应用程序正在访问它。为什么它不能包含有关正在使用数据库的进程的信息?我知道并不是每个人都Applicatio_Name在其连接字符串上传递属性,但是即使是有关所涉及机器的提示也可能会有所帮助。 另一个选择,也是SQL Server(和mySQL)是可爱的string or binary data would be truncated错误消息和等效项。很多时候,只需仔细阅读生成的SQL语句,表格就会显示出哪一列是罪魁祸首。情况并非总是如此,如果数据库引擎发现了错误,为什么它不能节省我们的时间,而只是告诉我们那是该死的列呢?在此示例中,您可能认为检查它可能会对性能造成影响,并且这会妨碍编写者。好我买 怎么样,一旦数据库引擎知道存在错误,它就会在事后快速比较要存储的值和列的长度。然后将其显示给用户。 ASP.NET的可怕表适配器也很内gui。可以执行查询,并且可以显示一条错误消息,指出某处的约束已被违反。感谢那。是时候将我的数据模型与数据库进行比较了,因为开发人员太懒了,甚至无法提供行号或示例数据。(根据记录,我从来没有使用这种数据访问方法的选择,它只是我继承了一个项目!)。 每当我从C#或C ++代码中引发异常时,我都会将手边的一切提供给用户。已经决定扔掉它,所以我可以提供的信息越多越好。为什么我的函数抛出异常?传递了什么,期望什么?我只需要一点时间就可以在异常消息的正文中添加有意义的内容。地狱,它只是帮助我,而我发展,因为我知道我的代码抛出的事情,是有意义的。 有人可能会辩称,不应将复杂的异常消息显示给用户。虽然我不同意这一点,但是根据您的构建,通过使用不同级别的冗长程度可以轻松地解决这个问题。即使这样,ASP.NET和SQL Server的用户也不是您的典型用户,他们宁愿使用充满冗长和美味信息的内容,因为他们可以更快地查找问题。 在当今时代,为什么开发人员认为可以在出现错误时提供最少量的信息呢? 这是2011人,前来上。

12
每班可以容纳多少人?
我是一位长期的开发人员(我49岁),但是是面向对象开发的新手。自从Bertrand Meyer的Eiffel以来,我一直在阅读有关OO的文章,但是几乎没有做过OO编程。 关键是每本有关OO设计的书都以船,汽车或我们经常使用的任何常见对象为例开始,并且它们开始添加属性和方法,并说明如何建模对象状态以及如何使用对象它。 因此,它们通常会采用“模型越好,模型在应用程序中代表对象的能力越强,结果就越好”的想法。 到目前为止,到目前为止还不错,但是,我发现有几位作者给出了一些食谱,例如“一个类应该放在一个页面上”(我会添加“显示器尺寸是多少?”,因为我们尝试不这样做)打印代码!)。 以一个PurchaseOrder类为例,该类具有控制其行为的有限状态机和的集合PurchaseOrderItem,此处工作的一个论据是,我们应该使用一个PurchaseOrder简单的类,并带有一些方法(比数据类多一点),并且具有PurchaseOrderFSM处理的有限状态机的“专家类” PurchaseOrder。 我想说的是Jeff Atwood 在《编码恐怖》上的Code Smells帖子的“特征嫉妒”或“不适当的亲密关系”分类。我将其称为常识。如果我可以签发,核准或取消我的真正的采购订单,那么PurchaseOrder类应该有issuePO,approvePO而且cancelPO方法。 这不是我理解为面向对象的基础的“最大化内聚力”和“最小化耦合”的古老原则吗? 此外,这是否有助于提高类的可维护性?

3
应用程序或域服务中的DDD存储库
这些天,我正在学习DDD,并且对如何使用DDD管理存储库有一些疑问。 实际上,我遇到了两个可能性: 第一 我读过的管理服务的第一种方法是在应用程序服务中注入存储库和域模型。 这样,在一种应用程序服务方法中,我们称为域服务方法(检查业务规则),如果条件良好,则在特殊方法上调用存储库以从数据库中持久化/检索实体。 一个简单的方法可以是: class ApplicationService{ constructor(domainService, repository){ this.domainService = domainService this.repository = repository } postAction(data){ if(this.domainService.validateRules(data)){ this.repository.persist(new Entity(data.name, data.surname)) } // ... } } 第二个 第二种可能性是将存储库注入domainService内,并且仅通过域服务使用存储库: class ApplicationService{ constructor(domainService){ this.domainService = domainService } postAction(data){ if(this.domainService.persist(data)){ console.log('all is good') } // ... } } class DomainService{ constructor(repository){ this.repository …


6
使用关系数据库与JSON对象获取事件/活动数据
我正在一个项目中尝试在一个标准SQL关系数据库或JSON对象之间存储有关事件或活动的数据。 该项目将存储多种事件类型的数据,因此我决定仅描述此问题的一种事件类型。 现场音乐事件(此问题底部使用JSON模式完整描述)是一个对象,用于存储数据,例如事件发生的地点,事件的时间/日期和事件的成本。现场音乐事件对象具有一对一(事件->名称,事件->描述)和一对多(事件->场所,事件->日期,事件->票证类型) )关系。此外,事件对象可以包含一个或多个执行者ID,这些ID链接到执行者对象。表演者对象存储有关在现场音乐事件中表演的音乐家的数据。 用户将使用简单数据(“以'x'名称为我查找事件”)和复杂数据(以'x'音乐体裁为'y'事件并在距我当前半径'z'范围内以'y'为代价的事件来查询数据)位置”)查询。数据将由用户使用Web表单提交。 从定义的JSON模式中可以看出,我本来打算使用JSON对象存储此数据,但是我听到有些人说,因为我的数据是纯关系型的,所以我应该坚持使用较旧的方法。 鉴于我的需要,我希望对每种方法的利弊有任何想法。如果您需要任何澄清,请随时询问。 { "event": { "eventID":{ "type":"string" }, "eventType":{ "type":"array", "eventTypeItem":{ "type":"string" } }, "eventName":{ "type":"string" }, "eventDescription":{ "type":"string" }, "eventVenueList":{ "type":"array", "eventVenueListID":{ "type":"integer" } }, "eventURL":{ "type":"string" }, "eventTwitter":{ "type":"string" }, "eventFB":{ "type":"string" }, "eventInstagram":{ "type":"string" }, "eventEmail":{ "type":"string", "format":"email" }, "eventContactPerson":{ "type":"string" }, …
28 design  sql  json 

2
历史增长的软件是否有命名的反模式?[关闭]
是否有一种反模式来描述一个历史悠久的软件系统,其中多个开发人员只是向系统添加了新功能,但没有人真正关注整个体系结构,也从未进行过重构? 我认为,当管理人员/客户不断要求新功能并且没有人重构任何东西而只是增加其他开发人员以前所做的事情时,就会发生这种情况。 原因还可能是开发人员对软件系统不知所措,并不真正了解它当前的工作方式,然后只是在最后添加/粘上了他的代码(而不是重构和更改代码)。 因此,随着时间的推移,维护系统变得越来越困难。 (我想知道是否有针对这种反模式的图片,以使所有编程人员都无法清楚了解它-就像一辆通过添加越来越多的功能而无需考虑整体设计而制造的汽车。就像有人需要拖曳拖车时向后骑,然后工程师只是将牵引杆焊接到汽车的前部。工作已经完成。但是现在,前围不再打开了。)

5
一个团队进行设计,另一个团队进行编码
我将参与一个项目,该项目的所有软件设计均由本地团队进行,然后将这些设计发送给离岸团队进行编码。 这是我第一次面对具有这种特征的项目,这对我来说有点奇怪:经理们希望我们制定非常详细的设计文件,因此离岸团队没有错误的余地。从我的角度来看,它们使我们可以在纸上进行编码,而我们可以在IDE中进行编码。 所以,我的问题是这种方法是好的还是正确的?我们的软件流程要在项目中取得成功,必须考虑哪些主要考虑因素?

6
是否有一种设计模式可以消除检查标志的需要?
我将在数据库中保存一些字符串有效负载。我有两个全局配置: 加密 压缩 可以使用配置启用或禁用这些功能,方法是仅启用其中一个,两个都启用或两个都禁用。 我当前的实现是这样的: if (encryptionEnable && !compressEnable) { encrypt(data); } else if (!encryptionEnable && compressEnable) { compress(data); } else if (encryptionEnable && compressEnable) { encrypt(compress(data)); } else { data; } 我在考虑装饰器模式。是正确的选择,还是有更好的选择?

10
简单vs复杂(但性能高效)解决方案-选择哪个,何时选择?
我已经编程了两年,经常发现自己陷入了困境。 有两种解决方案- 一种是简单的,即简单的方法,易于理解和维护。它涉及一些冗余,一些额外的工作(额外的IO,额外的处理),因此不是最佳的解决方案。 但是其他方法则使用复杂的方法,难以实现,通常涉及许多模块之间的交互,是一种高效的解决方案。 当我没有硬性能SLA甚至简单的解决方案都可以满足性能SLA时,我应该争取哪种解决方案?我对开发人员的简单解决方案不屑一顾。 如果您的性能SLA可以通过一个简单的解决方案来解决,那么提出最佳最佳复杂解决方案是一种好习惯吗?

6
面向对象的“规范化”
在数据库编程中,有一种称为“规范化”的技术可以对要存储的数据进行处理。 有没有人尝试将此概念应用于对象设计?你怎么样 效果如何? 编辑:为了扩展/阐明,数据库规范化不仅仅是减少冗余的一组原则。实际上,您需要经历一些步骤和阶段,并且至少要有一些适度的客观指标来告诉您所处的阶段。对象设计有其自身的原理,并且有嗅觉的概念,但是有什么办法可以做类似的事情来告诉您您是否处于XX-form0,1,2 ...等...以及移至下一个“标准化”级别的方法?
28 design 

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.