Questions tagged «design»

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

2
您将如何实施Google搜索?[关闭]
假设在一次采访中被问到“您将如何实施Google搜索?” 您将如何回答这样的问题?可能有一些资源可以解释Google如何实现某些功能(BigTable,MapReduce,PageRank等),但这并不完全适合采访。 您将使用什么总体架构,以及如何在15-30分钟的时间内解释这一点? 我将首先说明如何构建一个可处理约10万个文档的搜索引擎,然后通过分片扩展到约5000万个文档,然后再扩展一次体系结构/技术。 这是20,000英尺的视图。我想要的是细节-您在面试中如何实际回答。您将使用哪种数据结构。您的架构由什么服务/机器组成。典型的查询延迟是多少?故障转移/大脑分裂问题怎么办?等等...

10
单元测试如何促进设计?
我们的同事提倡编写单元测试,因为它实际上是在帮助我们改进设计和重构事物,但我不知道如何做。如果我正在加载CSV文件并进行解析,那么单元测试(验证字段中的值)将如何帮助我验证设计?他提到了耦合和模块化等问题,但是对我而言,这没有多大意义-但我的理论背景并不多。 这与您标记为重复的问题不同,我将对实际示例如何起到帮助作用感兴趣,而不仅仅是理论上说“有帮助”。我喜欢下面的答案和评论,但我想了解更多。

7
在业务逻辑中引用数据库值
我想这是关于硬编码和最佳实践的另一个问题。假设我有一个值列表,可以说是水果,存储在数据库中(它必须在数据库中,因为该表用于其他目的,例如SSRS报告),其ID为: 1 Apple 2 Banana 3 Grapes 我可以将它们呈现给用户,他选择一个,将其作为FavouriteFruit存储在他的个人资料中,并将ID存储在他的数据库记录中。 当涉及到业务规则/域逻辑时,将逻辑分配给特定值的建议是什么。假设用户选择了葡萄我想执行一些额外的任务,那么引用葡萄值的最佳方法是什么: // Hard coded name if (user.FavouriteFruit.Name == "Grapes") // Hard coded ID if (user.FavoriteFruit.ID == 3) // Grapes // Duplicate the list of fruits in an enum if (user.FavouriteFruit.ID == (int)Fruits.Grapes) 或者是其他东西? 当然,由于FavouriteFruit将在整个应用程序中使用,因此可以将列表添加或编辑。 有人可能会决定将“葡萄”重命名为“葡萄”,这当然会破坏硬编码的字符串选项。 硬编码的ID尚不完全清楚,如图所示,您可以添加注释以快速识别它是哪个项目。 枚举选项涉及从数据库中复制数据,这似乎是错误的,因为它可能不同步。 无论如何,在此先感谢您的任何意见或建议。
43 design 

7
什么时候不应用依赖倒置原则?
我目前正在尝试弄清SOLID。因此,依赖倒置原则意味着任何两个类都应该通过接口而不是直接进行通信。示例:如果class A有一个方法,该方法需要一个指向类型的对象的指针class B,则该方法实际上应在一个类型为对象的对象abstract base class of B。这对打开/关闭也有帮助。 如果我理解正确,那么我的问题是将其应用于所有类交互是一种好习惯还是应该尝试从层次上考虑? 我对此表示怀疑是因为我们为遵循这一原则付出了一些代价。说,我需要实现feature Z。经过分析,我的结论是功能Z包含的功能A,B和C。我创建了一个门面类Z,即,通过接口,使用类A,B和C。我开始编码的实施,在某些时候我意识到,任务Z实际上是由功能性A,B和D。现在,我需要取消C界面,C类原型并编写单独的D界面和类。如果没有接口,则只需要替换该类。 换句话说,要更改某些内容,我需要更改1.调用者2.接口3.声明4.实现。在python直接耦合的实现中,我只需要更改实现。

7
SOLID原则与YAGNI
SOLID原则何时会成为YAGNI? 作为程序员,我们始终在复杂性,可维护性,构建时间等之间进行权衡。在我看来,其中两项最明智的选择准则是SOLID原则和YAGNI。如果您不需要它;不要建造它,并保持干净。 现在,例如,当我观看SOLID上的dimecast系列节目时,我看到它开始时是一个非常简单的程序,然后结束时是一个非常复杂的程序(当然,在旁观者看来,复杂性也是如此),但是它仍然使我想知道:SOLID原则何时会变成您不需要的东西?所有坚实的原则都是可以使用户在以后进行更改的工作方式。但是,如果要解决的问题是一个非常简单的问题,并且是一个一次性应用程序,该怎么办?还是SOLID原则始终适用? 如评论中所述: SOLID原则 亚尼

6
首席开发人员在敏捷团队中的作用是什么?
在非敏捷开发团队中,首席开发人员通常: 设置标准(编码等) 为团队研究新技术 为团队设定技术方向 对事情有最终决定权 设计系统架构 但是,敏捷团队的工作方式有所不同: 敏捷团队将依靠紧急设计,而不是预先设计 敏捷团队一起设计,而不是由一个人决定设计 敏捷团队决定自己的技术方向,这是交付项目的最佳选择 这将使敏捷开发团队中的首席开发人员离开哪里?在敏捷团队中是否可能有首席开发人员?敏捷团队是否需要与领导不同的职责?

7
我如何根据主管的建议停止设计并开始设计该项目?[关闭]
我是一名初级开发人员(约3年经验),在我的工作中,我们正在设计一个新系统。我的首席开发人员将是首席架构师,但是他向我提出挑战,要求我自己(并行)架构系统。 在反复集思广益的想法并提出我认为是架构建议的过程中,我的领导给了我反馈,我所做的大部分工作都是“设计”而不是“架构”。 他将差异描述为架构与实现无关,而设计是对实现的描述。他说我需要脱下设计师的帽子,戴上建筑师的帽子。他给了我一些建议,但我也想问你: 如何摆脱软件设计师模式,开始像架构师那样思考? 以下是我提出的一些“设计” 示例,这些示例被我的领导认为与架构无关: 我想出了一种用于从系统中加载和卸载资源的算法,我的负责人说算法绝对不是体系结构。 我想出了系统应该引发的一系列事件以及应该以什么顺序引发它们,但是这似乎也没有将其视为架构。 我似乎陷入了细节之中,没有退后一步。我发现,即使我提出的是体系结构级别的内容,我也经常通过尝试各种实现并仔细研究细节,然后进行概括和抽象来达到目标​​。当我向我的领导描述时,他说我采用了错误的方法:我需要思考的是“自上而下”而不是“自下而上”。 这里是有关该项目的一些更具体的细节: 我们正在设计的项目是一个Web应用程序。 我估计大约有10到10万行代码。 我们是一家初创公司。我们的工程团队大约3-5人。 我可以将应用程序与之最接近的是轻量级CMS。它具有类似的复杂性,并且主要处理组件的加载和卸载,布局管理以及插件样式的模块。 该应用程序是ajax-y。用户一次下载客户端,然后根据需要从服务器请求数据。 我们将使用MVC模式。 该应用程序将具有身份验证。 我们不是很在意旧的浏览器支持(哇!),因此我们希望利用现有的最新和最大的支持。(HTML5,CSS3,WebGL ?、媒体源扩展等等!) 这是该项目的一些目标: 应用程序需要扩展。在不久的将来,我们的用户数量将达到数百至数千,但我们正在计划数以万计至数百万甚至更多。 我们希望该应用程序永远存在。这不是临时解决方案。(实际上,我们已经有了一个临时的解决方案,而我们正在设计的是长期替代现有的解决方案)。 该应用程序应该安全,因为它可能与敏感的个人信息联系在一起。 应用程序必须稳定。(理想情况下,它在gmail级别左右是稳定的,但不必在火星漫游者的极端位置。)

6
与图形设计师合作的正确方法是什么?[关闭]
最近,我们与一位图形设计师(由客户安排)合作,为我们构建的Django + Bootstrap应用程序提供了外观。设计师提供了新布局的一系列静态图像,以及描述一些技术属性(字体大小,颜色,一些尺寸等)的文档。 事实证明,实现此目标非常耗时。尽管整个站点基本上都是首页,索引页和六个详细页面,但我花了至少5天时间才实现CSS和HTML更改。所以我会弯腰称这为错误的方式。 我的基本方法是: 比较静态图像和当前渲染,并注意差异。 猜猜在CSS / HTML中需要进行哪些更改 做出改变 转到步骤1。 我不了解某些特殊问题,因为该设计包括将8列更改为12列,某些图像格式错误(.png在不同的浏览器/平台组合上可能呈现不同的图像),麻烦于尝试撤消Bootstrap的样式,通常的CSS角力,以达到像素完美的渲染等效果。有时,我不得不重新组织HTML模板以获得某种行为。 正确的方法是什么?

3
我应该使用配置文件还是数据库来存储业务规则?
我最近在阅读《实用程序员》,其中指出: 细节弄乱了我们原始的代码,尤其是如果它们经常更改。每次我们必须修改代码以适应业务逻辑,法律或管理层的个人喜好时,都会冒着破坏系统的风险—引入新的错误。 亨特,安德鲁;托马斯·戴维(1999-10-20)。实用程序员:从《旅人》到《大师》(Kindle位置2651-2653)。培生教育(美国)。Kindle版。 我目前正在编程一个具有某些模型的Web应用程序,这些模型的属性只能来自一组值,例如(由于Web应用程序数据是机密的,因此不是实际示例): light-> type =球体/立方体/圆柱体 光源类型只能是上述三个值,但根据TPP,我应始终进行编码,好像它们可以更改并将其值放置在配置文件中一样。由于在整个应用程序中都发生过几次此类事件,因此我的问题是: 我是否应该在以下位置存储类似的值: 配置文件: 'light-types' => array(sphere, cube, cylinder), 'other-type' => value, 'etc' => etc-value 数据库中的一个表,每个配置项一行 一个数据库,其中每个配置项都有一个表(例如table light_types:; columns :id、name) 其他方式? 非常感谢您提供的任何帮助/专业知识。

15
使函数本质上重命名内置函数是否不明智?
在某些情况下,我对最小和最大函数感到困惑。 在一种情况下,当您使用函数取两个值中的更大或更小值时,就没有问题。例如, //how many autographed CD's can I give out? int howManyAutographs(int CDs, int Cases, int Pens) { //if no pens, then I cannot sign any autographs if (Pens == 0) return 0; //I cannot give away a CD without a case or a case without a CD return min(CDs, …

9
在进行TDD时需要记录日志吗?
在进行红色,绿色和重构循环时,我们应始终编写最少的代码以通过测试。这就是我被教导有关TDD的方式,以及几乎所有书籍都描述该过程的方式。 但是日志记录呢? 老实说,除非发生真正复杂的事情,否则我很少在应用程序中使用日志记录,但是,我看到无数篇文章都谈到了正确日志记录的重要性。 因此,除了记录异常外,我无法证明在适当的经过测试的应用程序(单元/集成/验收测试)中记录日志的真正重要性。 所以我的问题是: 如果正在执行TDD,是否需要记录?失败的测试不会揭示应用程序有什么问题吗? 是否应该在每个类的每个方法中为日志记录过程添加测试? 例如,如果在生产环境中禁用了某些日志级别,这是否会在测试和环境之间引入依赖性? 人们谈论日志如何简化调试,但是TDD的主要优点之一是,我始终知道由于测试失败而出了什么问题。 有什么我想念的吗?

6
为什么要避免Java继承“扩展”
詹姆斯·戈斯林说 “您应该尽可能避免实现继承。” 而是使用接口继承。 但为什么?如何避免使用关键字“ extends”继承对象的结构,同时使我们的代码面向对象? 有人可以在“在书店订购书”的情况下,提供一个面向对象的示例来说明此概念吗?

7
具有定义常量的接口是不好的做法吗?
我正在用Java编写一组junit测试类。有几个常量,例如在不同的测试类中需要的字符串。我正在考虑一个定义它们的接口,每个测试类都将实现它。 我看到的好处有: 轻松访问常量:MY_CONSTANT而不是ThatClass.MY_CONSTANT 每个常量仅定义一次 这种方法是好的还是坏的做法?我觉得有点滥用接口的概念。 您通常可以回答有关接口/常量的问题,也可以回答有关单元测试的问题(如果有什么特别之处)。

3
AngularJS:使用多个ng-apps构建Web应用程序
Blogosphere上有许多关于AngularJS应用程序结构准则的文章,例如: http://www.johnpapa.net/angular-app-structuring-guidelines/ http://codingsmackdown.tv/blog/2013/04/19/angularjs-modules-for-great-justice/ http://danorlando.com/angularjs-architecture-understanding-modules/ http://henriquat.re/modularizing-angularjs/modularizing-angular-applications/modularizing-angular-applications.html 但是,对于指导原则和最佳实践,我尚未遇到的一种情况是,您有一个包含多个“迷你spa”应用程序的大型Web应用程序,而迷你spa应用程序都共享一定数量的代码。 我并不是指试图ng-app在同一页面上有多个声明的情况;相反,我的意思是大型站点的不同部分具有自己的唯一ng-app声明。 正如Scott Allen在他的OdeToCode博客中写道: 我还没有找到一种很好解决的方案,即在同一更大的Web应用程序中存在多个应用程序,并且需要客户端上一些共享代码的情况。 您是否可以建议任何建议的方法,应避免的陷阱或该场景的良好样本结构? 更新 -9/10/2015一个具有有趣组织策略的项目是MEAN.JS及其modules文件夹。 https://github.com/meanjs/mean https://github.com/meanjs/mean/tree/master/modules 另一个示例来自ASP.NET Music Store SPA示例。 https://github.com/aspnet/MusicStore https://github.com/aspnet/MusicStore/tree/master/src/MusicStore.Spa/ng-apps

13
使用布尔参数确定值是否错误?
根据使用布尔参数确定行为是否错误?,我知道避免使用布尔参数来确定行为的重要性,例如: 原始版本 public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } 新版本: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } 但是,使用boolean参数来确定值而不是行为的情况如何呢?例如: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } 我试图消除isHintOn标志并创建2个单独的函数: public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public void setHintOff(){ this.layer1.visible=false; this.layer2.visible=true; this.layer3.visible=false; } …

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.