Questions tagged «design»

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

3
为有状态系统设计单元测试
背景 在我完成学业后,测试驱动开发得到了普及。我正在尝试学习它,但是一些主要的事情仍然无法解决。TDD的支持者说了很多类似的东西(以下称为“单一声明原则”或SAP): 一段时间以来,我一直在思考TDD测试如何尽可能简单,富有表现力和优雅。本文探讨了使测试尽可能简单和可分解的感觉:针对每个测试中的单个断言。 来源:http://www.artima.com/weblogs/viewpost.jsp? thread = 35578 他们还说这样的话(以下称为“私有方法原理”或PMP): 通常,您不直接对私有方法进行单元测试。由于它们是私有的,因此请考虑将其作为实现细节。没有人会打电话给他们中的一个,并期望它以特定的方式工作。 相反,您应该测试您的公共接口。如果调用您的私有方法的方法按预期工作,则可以假定您的私有方法正常工作。 资料来源:您如何对私有方法进行单元测试? 情况 我正在尝试测试有状态的数据处理系统。给定接收数据之前的状态,系统可以对完全相同的数据执行不同的操作。考虑一个简单的测试,该测试建立系统中的状态,然后测试给定方法要测试的行为。 SAP建议我不要测试“状态构建过程”,我应该假设状态是我希望从构建代码中得到的状态,然后测试我要测试的一个状态更改 PMP建议我不能跳过此“状态建立”步骤,而只能测试独立控制该功能的方法。 我实际代码中的结果是测试膨胀,复杂,冗长且难以编写。而且,如果状态转换发生变化,则必须更改测试……这对于小型,高效的测试是可以的,但对于这些冗长的测试却非常耗时且令人困惑。通常如何做?

7
静态数据应该存储在数据库中还是其他地方?
我目前正在开发某些软件,但不确定该采用哪种方法。我有一些数据要存储在移动设备上的某个地方。数据将永远不会改变,并具有层次关系,并将用于填充显示。有相当数量的此数据。 我有以下选择: 一组枚举/对象 XML文件 嵌入式SQLite数据库 在这种特殊情况下,我认为enums选项的工作量最少,但是我从这样的代码中嵌入的数据中获得了味道。 我认为XML文件最有意义,但是解析它会浪费资源,因为它永远不会改变。 数据库应该不会对性能造成太大的影响,但是对于静态数据来说似乎有点过分了。 这里正确的设计路径是? 注意: “永不更改”是指更改很少。有问题的数据是一组政府标准的模型,因此它们将来很可能会发生变化,但它不会定期更新,也不会自动更新我们的软件,因为标准的变化很可能会触发我们需求的变化。
20 design 

3
PHP Web应用程序体系结构/设计
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我已经被投入到使用PHP开发Web应用程序的新工作中。我绝不是PHP的新手,但我以前从未开发过大型应用程序。我想知道如何安排自己的发展,以避免将来遇到麻烦。如何以合理的方式设计和构造应用程序,以使它们可以在功能和性能方面随时间扩展。我在想这样的事情: 将后端与前端分开 目录结构 我希望能获得指向体系结构和应用程序设计模式,框架和方法的指针,这些指针使我能够以可持续的方式进行大规模PHP Web应用程序开发。


2
在网站上使用HTML / CSS布局有哪些选择?[关闭]
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么答案正确的解释。没有足够详细信息的答案可以被编辑或删除。 很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以当前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 是否有任何正在使用中的,甚至只是概念性的尝试来创建标记或程序化表达式,以设计HTML / CSS以外的网站布局? 如果那里还有其他物品,并且似乎没有被大量使用。为什么是这样?

3
永远不要让公众成员虚拟/抽象-是吗?
早在2000年代,我的一位同事就告诉我,将公共方法虚拟化或抽象化是一种反模式。 例如,他认为这样的课程设计得不好: public abstract class PublicAbstractOrVirtual { public abstract void Method1(string argument); public virtual void Method2(string argument) { if (argument == null) throw new ArgumentNullException(nameof(argument)); // default implementation } } 他说 实现Method1并重写的派生类的开发人员Method2必须重复参数验证。 如果基类的开发人员决定在Method1或Method2以后的可自定义部分周围添加一些内容,他将无法执行。 相反,我的同事提出了这种方法: public abstract class ProtectedAbstractOrVirtual { public void Method1(string argument) { if (argument == null) throw new …

1
嵌套的REST网址和父ID,哪个设计更好?
好的,我们有两个资源:Album和Song。这是API: GET,POST /albums GET,POST /albums/:albumId GET,POST /albums/:albumId/songs GET,POST /albums/:albumId/songs/:songId 我们知道我们讨厌某首歌,Susy例如。我们应该在哪里search采取行动? 另一个问题。好吧,现在更真实了。我们打开专辑1并加载所有歌曲。我们创建了JS对象,每个对象都保存歌曲数据,并具有如下几种方法:remove,update。 歌曲对象具有ID,名称和内容,但是不知道它属于哪个父对象,因为我们通过查询来检索歌曲列表,因此每个父对象都返回父ID并不是很好。我错了吗? 因此,我看到的解决方案很少,但我不确定。 将父ID设为可选-作为get-parameter。我目前使用的是这种方法,但我觉得它很丑。 List,Create /songs?album=albumId Update,Delete /songs/:songId Get /songs/?name=susy # also, solution for first question 混合动力车 现在方便了,因为我们需要唱片集ID来执行OPTIONS查询以获取元数据。 List,Create /album/:albumId/songs Update,Delete /songs/:songId POST /songs/search # also, solution for first question 返回每个资源实例的完整URL。API是相同的,但是我们会得到如下歌曲: id: 5 name: 'Elegy' url: /albums/2/songs/5 我听说这种方法称为HATEOAS。 所以...提供父母身分证 id: …

10
在开发的开始或结束时,什么时候更好地优化软件以获得更好的性能?
我是一名初级软件开发人员,我想知道什么时候是优化软件以提高性能(速度)的最佳时机。 假设该软件不是非常庞大且难以管理,是花更多的时间在开始对其进行优化上还是我应该只是开发能够正确执行所有功能的软件,然后继续对其进行优化以获得更好的性能?

5
“深度合成层次结构”也不难吗?
抱歉,“合成层次结构”不是问题,但我将在问题中解释我的意思。 没有任何OO程序员没有遇到过“保持继承层次结构平坦”或“优先考虑继承而不是继承”等变体。但是,深层次的组合层次结构似乎也存在问题。 假设我们需要一组详细说明实验结果的报告: class Model { // ... interface Array<Result> m_results; } 每个结果都有某些属性。其中包括实验时间以及实验各个阶段的一些元数据: enum Stage { Pre = 1, Post }; class Result { // ... interface Epoch m_epoch; Map<Stage, ExperimentModules> m_modules; } 好,很好。现在,每个实验模块都有一个描述实验结果的字符串,以及对实验样本集的引用的集合: class ExperimentalModules { // ... interface String m_reportText; Array<Sample> m_entities; } 然后每个样本都有...好,您得到了图片。 问题是,如果我要在应用程序域中对对象建模,这似乎是很自然的选择,但是最终,a Result只是一个愚蠢的数据容器!为它创建大量的类似乎并不值得。 假设上面显示的数据结构和类正确地对应用程序域中的关系建模,是否有更好的方法可以对这种“结果”进行建模,而无需求助于深层次的构成层次结构?是否有任何外部环境可以帮助您确定这种设计是否是好的?


8
程序员有时对自己的代码不具有100%的清晰度是正常的吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我不是专业的程序员,所以这也许就是原因。但是我注意到,每当我创建复杂的代码(例如我最近制作的国际象棋游戏)时,我都可以编写正确的代码来使程序正常工作,尽管我后来发现,甚至几秒钟之后! 不仅如此,我还倾向于不考虑代码,而是直接键入。例如,在我的国际象棋游戏中,我决定使用一个五维数组来处理移动,而我发现无需过多的自觉思考就可以做到这一点。但是,当我停下来仔细阅读它时,发现对整个5维概念有所了解是很困难的,并且花了几分钟的时间才能完全了解我的操作以及代码本身的工作方式。 对于程序员来说,编写复杂的代码而一半时间都不了解他们在做什么是正常的吗?

4
“使用地图代替类来表示数据” -Rich Hickey
在Clojure创作者Rich Hickey的这段视频中,他建议使用map来表示数据,而不是像Java那样使用类来表示数据。我不明白该怎么做,因为如果API用户将其简单地表示为地图,他们怎么会知道输入键是什么。 范例: PersonAPI { Person addPerson(Person obj); Map<String, Object> addPerson(Map<String, Object> personMap); } 在第二个函数中,API用户如何知道创建人的输入是什么?
19 java  design  class  clojure  map 

8
在Java 7中打开字符串有什么好处?
当我开始用Java编程时,switch语句不带字符串的事实使我感到沮丧。然后,在使用Enums时,我意识到与它们相比,您所获得的好处而不是传递原始值-类型安全性(这使得重构更容易),同时也使其他开发人员更清楚。 我正在努力思考一种情况,在SE7中,我现在决定使用带有字符串而不是Enums作为输入的开关。如果通过打开整个字符串(例如,而不是部分匹配或正则表达式匹配)来实现它们,则似乎并没有提供更少的理由来更改代码。 借助IDE工具和编码的读写比率,我会比传递字符串值更快乐地自动生成一个额外的Enum。 他们作为程序员给我们带来什么好处?更少的样板? 似乎该功能并未让该语言大声疾呼。尽管可能有一个我忽略的用例。

4
如何在关系数据库驱动的应用程序中设计不好的数据库中创建更好的OO代码
我正在编写一个Java Web应用程序,该应用程序主要由一堆相似的页面组成,其中每个页面都有多个表和一个适用于这些表的过滤器。这些表上的数据来自SQL数据库。 我将myBatis用作ORM,在我的情况下,这可能不是最佳选择,因为数据库设计不良,而mybatis是面向数据库的工具。 我发现我正在编写很多重复的代码,因为由于数据库的不良设计,我不得不为类似的事情编写不同的查询,因为这些查询可能非常不同。也就是说,我无法轻松地将查询参数化。这会传播到我的代码中,而不是通过一个简单的循环来填充表中列上的行,我将代码改为: 得到一个数据(p1,...,pi); 得到B数据(p1,...,pi); 获得C数据(p1,...,pi); 获得D数据(p1,...,pi); ... 当我们有带有不同列的不同表时,这很快就会爆炸。 这也增加了我使用“ wicket”的复杂性,实际上是将对象映射到页面中的html元素。因此,我的Java代码成为了数据库和前端之间的适配器,这使我创建了许多布线,样板代码,并在其中混入了一些逻辑。 正确的解决方案是在ORM映射器上包裹一个额外层,该额外层为db提供一个更均匀的接口,还是有更好的方法来处理我正在编写的这些意大利面条式代码? 编辑:有关数据库的更多信息 该数据库主要保存电话信息。较差的设计包括: 具有人工ID作为主键的表与域知识无关。 没有唯一,触发器,检查或外键。 具有通用名称的字段,这些字段匹配不同记录的不同概念。 只能通过与其他具有不同条件的表交叉才能分类的记录。 应为数字或日期存储为字符串的列。 综上所述,到处都是凌乱/懒惰的设计。

2
如何在保持效率的同时将用户界面与业务逻辑分开?
假设我想显示一个表示组合框上10个不同对象的表单。例如,我希望用户从10个不同的包含番茄的汉堡包中选择一个。 因为我想分离UI和逻辑,所以我必须通过表单来表示汉堡包的字符串,以便在组合框中显示它们。否则,UI必须深入到对象字段。然后,用户将从组合框中选择一个汉堡包,并将其提交回控制器。现在,控制器将不得不根据表单使用的字符串表示形式(也许是ID?)再次查找所述汉堡包。 这不是效率低下吗?您已经有了想要从中选择一个的对象。如果您将整个对象提交给表单,然后返回一个特定的对象,则以后不必重新引用它,因为表单已经返回了对该对象的引用。 而且,如果我错了,而您实际上应该将整个对象发送到表单,那么如何将UI与逻辑隔离?

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.