Questions tagged «design»

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

4
如何在我的代码中避免“经理”
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 6年前。 我目前正在为C ++ 重新设计我的实体系统,并且我有很多经理。在我的设计中,我有这些类,以便将我的库联系在一起。关于“经理”类,我听说过很多坏事,也许我没有适当地命名我的类。但是,我不知道还有什么名字。 在我的图书馆中,大多数经理都是由以下类组成的(尽管确实有所不同): 容器-管理器中对象的容器 属性-管理器中对象的属性 在我的图书馆新设计中,我有这些特定的类,以便将我的图书馆联系在一起。 ComponentManager-管理实体系统中的组件 组件容器 ComponentAttributes 场景*-对场景的引用(请参见下文) SystemManager-管理实体系统中的系统 系统容器 场景*-对场景的引用(请参见下文) EntityManager-管理实体系统中的实体 EntityPool-实体池 EntityAttributes-实体的属性(只能由ComponentContainer和System类访问) 场景*-对场景的引用(请参见下文) 场景-将所有经理联系在一起 组件管理器 系统管理员 实体管理器 我当时只是想将所有容器/池放入Scene类本身。 即 代替这个: Scene scene; // create a Scene // NOTE: // I technically could wrap this line …

9
是否有遵循最小化开发方法的编程语言?
我发现,当语言被认为与商业软件相同时,总是不断需要添加新功能来证明新版本的合理性。 最终版本1.0是否存在或存在某些语言?当然,错误修复不受此约束,但是功能集始终保持不变吗? 这样,该语言中的每个功能都可以很好地组合在一起,并且由于向后兼容性,在过时的功能仍然存在的情况下,似乎并没有将它们固定在一起。 我假设有些学术语言是这样的吗?但是,是否有遵循该想法的商业上成功的语言?随附的库也可以免费获得新功能,但是语言始终保持不变。 我可以举一个例子,我最喜欢的一种C#语言,我经常使用它,每个发行版中都添加了越来越多的功能。要利用这些优势,我必须放弃实际的任务,花大量的时间学习这些任务,而不是掌握一些琐碎的概念并将它们自己组合起来,以轻松地解决更复杂的问题。 因此,我想我正在寻找一种最小化的方法,该方法应使所有内容保持一致,合理并尽可能正交。


8
在数据库中存储地理地址/位置的通用方法是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 什么是地理地址/位置的正确格式,最适合地球上的任何地址?目前,我有: 国家 市 街 数 文本数据(为简单起见) 压缩 纬度/经度 但是我相信我可以改善它:一个国家或地区或地区之类的东西。或在新加坡或香港没有区域/地区/州。 可能没有街道,但道路,林荫大道或其他东西。许多建筑物可能是复合的。可能有地板。房间号。等等....

4
是否有充分的理由使纯函数不公开?
我和一位同事进行了一些辩论。简而言之,是否有充分的理由隐藏/封装纯函数? “纯”是指维基百科定义: 始终从相同的输入返回相同的结果。(出于讨论的Foo Create(){ return new Foo(); }目的,如果Foo不具有值语义,则认为这是不纯的。) 不使用可变状态(局部变量除外)或I / O。 不会产生副作用。

7
HTML5,本机和混合移动应用程序方法的优缺点是什么?
我想开发一个移动应用程序。我最近在Telerik论坛上阅读了一篇文章,该文章比较了三种类型的移动应用程序,但我不知道应该选择哪种类型。这是一张描述不同移动设计选择的利弊的图像 为了在这些设计选择之间做出决定,我想更好地理解图中列出的每种体系结构选择的利弊。每种架构方法的优缺点是什么?

5
设计文档作为敏捷的一部分
在我的工作场所,我们面临的挑战是“敏捷”常常意味着“含糊的要求,不良的接受标准,好运!” 我们正在努力解决这一问题,作为一项总体改进工作。 因此,作为其中的一部分,我建议我们生成设计文档,这些文档要超出用户故事级别,并且能准确反映对系统中给定功能的效果进行初步调查的结果,并包括对我们所遇到问题的解答问生意。 有没有有效的标准呢? 我们目前面临的情况是,一项新功能可能会影响我们的“大泥巴”系统中的多个区域,并且由于这种技术债务,估计开始上升。希望更多周到的设计过程可以提供帮助。

3
REST端点为预见的更改进行规划的建议模式是什么
尝试为具有变更前瞻性的外部应用程序设计API并非易事,但预先考虑可以使以后的生活变得更轻松。我正在尝试建立一个方案,以支持将来的更改,同时通过保留先前的版本处理程序来保持向后兼容。 本文的主要关注点是对于给定产品/公司,所有定义的端点应遵循哪种模式。 基本方案 鉴于基本URL模板https://rest.product.com/我设计,所有的服务都位于下/api沿/auth和其他基于非休息终点如/doc。因此,我可以如下建立基本端点: https://rest.product.com/api/... https://rest.product.com/auth/login https://rest.product.com/auth/logout https://rest.product.com/doc/... 服务端点 现在是端点本身。关注度POST,GET,DELETE不是本文的主要目的,是对这些行为本身的关注。 端点可以分为名称空间和动作。每个动作还必须以支持返回类型或所需参数的基本更改的方式显示自己。 在注册用户可以发送消息的假设聊天服务中,我们可能具有以下端点: https://rest.product.com/api/messages/list/{user} https://rest.product.com/api/messages/send 现在添加版本支持,以支持将来可能会中断的API更改。之后我们既可以添加版本签名/api/或之后/messages/。给定send端点,我们可以为v1提供以下内容。 https://rest.product.com/api/v1/messages/send https://rest.product.com/api/messages/v1/send 所以我的第一个问题是,版本标识符的推荐位置是什么? 管理控制器代码 因此,现在我们已经确定需要支持以前的版本,因此需要以某种方式处理可能随着时间而弃用的每个新版本的代码。假设我们正在用Java编写端点,则可以通过包来管理它。 package com.product.messages.v1; public interface MessageController { void send(); Message[] list(); } 这样做的好处是,所有代码已通过命名空间分隔开,其中的任何重大更改都将意味着服务端点的新副本。这样做的不利之处在于,需要复制所有代码,并且希望对每个副本都应用/测试希望应用于新版本和先前版本的错误修正。 另一种方法是为每个端点创建处理程序。 package com.product.messages; public class MessageServiceImpl { public void send(String version) { getMessageSender(version).send(); } // Assume we have …

8
可以使用什么软件来创建架构图?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 当我需要能够将图保存在某处并稍后进行编辑时,我将MS Visio用于大部分设计/架构工作。我不是Visio的最大粉丝,但是它可以完成工作(而且工作是免费的)。 我想知道你们是否曾经使用过并且感到满意的相当昂贵的Visio软件的替代品,甚至更好的东西。我当然希望在我的工具箱中有该程序!

6
什么时候可以接受对父指针的循环引用?
这个堆栈溢出问题是关于一个孩子通过指针对其父对象的引用。 最初,评论对于设计是一个可怕的想法至关重要。 我了解这通常不是最好的主意。从一般的经验来看,似乎很公平地说:“不要这样做!” 但是,我想知道在什么样的条件下您将需要执行以下操作。这里的问题和相关的答案/注释甚至建议图不要做这样的事情。
24 design 

8
每天执行一次用户操作:24小时重置与午夜重置[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 12个月前关闭。 当用户每天只能执行一次动作(例如,获得比赛的免费门票)时,我会遇到两种可能性。 1)24小时重置 如果他在第1天的晚上11:45执行动作,则只能在第2天的11:45或之后再次执行动作。他将无法在第二天的11:44做到这一点。 2)午夜重置(或任何固定时间) 无论用户在第1天什么时候执行该操作,只要它变成午夜且第2天开始,他都将能够再次执行该操作。 两者都限制了用户每天仅执行一项操作,但是我经常遇到方法1,我认为这样做很不方便,原因有两个: 首先,我必须等待时间 在很长一段时间内,我执行动作的时间戳会变得越来越迟,因为我将无法在每天的那个时间戳上准确地执行动作,而只能在几秒钟或几分钟后执行。 有什么技术上的原因,尽管我认为对于事先说明的用户来说,重要的缺点是它会首选方法1? 编辑,以指定:我特别是在谈论一个示例,其中显然不需要24小时的实际时间间隔,例如在当前的Theory11自由旋转事件中,您每24小时可获得1次自由旋转以获得机会在获奖中。

5
重新设计数据库的最佳实践
在为应用程序设计数据库时,我知道一些通用的最佳做法,但是重新设计呢? 我正在一个负责重新设计内部业务应用程序的团队中,尽管尽管我说的是“内部”,但不幸的是,我仍然有很多很多层次的人无法与系统的实际用户联系。 当前程序以Oracle Forms形式存在,散布在许多非规范化表中,有时还有多个几乎重复的表,它们在彼此的数据上略有不同。约束通常以存储过程执行不力的形式出现。甚至类型似乎也没有正确存储。我遇到了各种各样的错误数据,Oracle似乎忽略了这些错误数据,但这些数据适合SQL Server的“导入/导出向导”。(例如,两位整数不构成完整的日期时间!) 原始程序可能要追溯到二十年前,所有原始开发人员都已经退休很久了,以至于这里的老年人也不知道他们是谁。结果,实际上也没有任何干净的要求—我们只应该复制现有应用程序的功能并保留其现有数据。 重写的最终结果将是在ASP.NET上运行的基于Web的版本,后端是MS SQL Server。 我的另外两个开发团队成员都比我大得多,都具有商业/ MIS背景,而我的则是CS。高级成员的经验几乎完全是Oracle表格,而其他成员则主要在Visual Basic中完成业务应用程序工作。尽管我的数据库背景仅限于为MySQL或SQLite中的项目设计新数据库,主要是针对我的本科课程,但我似乎是唯一拥有实际设计数据库经验的人。 我已经用C#编写了一个小程序,该程序将所有现有数据读取为中性格式,可以重新广播并放置到新数据库中。我计划在设计目标数据库之后编写加载代码,以便可以在新的规范化表中正确分割数据,以正确的顺序添加数据以遵循新的约束,等等。然后可以再次运行同一程序将生产数据复制到真正新部署的完成的重新设计中。剩下的主要工作是对数据库进行实际的重新设计。 所以我的问题的核心:从现有应用程序的数据库级别进行重新设计的最佳实践是什么?

8
谎言2:代码应该围绕世界模型进行设计吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 我最近读了《三大谎言》博客,我很难证明第二种谎言的正确性,在此引用: (LIE#2)应该围绕世界模型设计代码 代码是虚拟世界的某种模型或地图,没有任何价值。我不知道为什么这个程序对某些程序员如此引人注目,但是它非常受欢迎。如果游戏中有火箭,请放心,有一个“火箭”类(假设代码是C ++),其中包含仅一枚火箭的数据并具有火箭的功能。完全不考虑实际上是在进行什么数据转换,也不考虑数据的布局。或就此而言,如果没有基本的了解,那就是哪里有一件东西,可能不止一件。 尽管这种设计会带来很多性能损失,但最重要的是它无法扩展。完全没有 一百枚火箭的成本是一枚火箭的一百倍。而且极有可能它的成本甚至更高!即使对于非程序员,这也没有任何意义。规模经济。如果您有更多东西,它应该会更便宜,而不是更贵。做到这一点的方法是正确设计数据并通过类似的转换对事物进行分组。 特别是这是我的问题。 作为虚拟世界的模型/地图,代码具有价值,因为对虚拟世界进行建模有助于(至少个人而言)可视化和组织代码。 对我来说,开设“火箭”课是一个完全有效的选择。也许“火箭”可以分为多种类型的火箭,例如AGM-114地狱火等,其中包含有效载荷强度,最大速度,最大转弯半径,瞄准类型等,但仍然每个发射的火箭都需要有一个位置和速度。 当然拥有100枚火箭弹的成本要高于1枚火箭弹的成本。如果屏幕上有100个火箭,则必须进行100次不同的计算才能更新其位置。第二段听起来好像是在宣称如果有100枚火箭,更新状态的花费应该少于100次计算? 我的问题是作者提出了一个“有缺陷的”编程模型,但没有提出“纠正”的方法。也许我在模仿Rocket类,但我真的很想了解这个谎言的原因。有什么选择?

4
在构造函数中合法的“实际工作”?
我正在设计,但是一直遇到障碍。我有一个特定的类(ModelDef),它实际上是通过解析XML模式(例如DOM)构建的复杂节点树的所有者。我想遵循良好的设计原则(SOLID),并确保生成的系统易于测试。我打算使用DI来将依赖项传递到ModelDef的构造函数中(以便在测试过程中可以根据需要轻松地将其替换掉)。 不过,我正在努力的是创建节点树。该树将完全由简单的“值”对象组成,而这些对象无需独立测试。(但是,我仍然可以将抽象工厂传递到ModelDef中,以帮助创建这些对象。) 但是我一直在读,构造函数不应该做任何实际的工作(例如Flaw:Constructor可以进行实际工作)。如果“实际工作”意味着构造重量较重的相关对象,而以后可能希望将其存根进行测试,则这对我来说非常有意义。(这些应通过DI传递。) 但是像该节点树这样的轻量级对象呢?必须在某个地方创建树,对不对?为什么不通过ModelDef的构造函数(例如使用buildNodeTree()方法)呢? 我真的不想在ModelDef之外创建节点树,然后再通过(通过构造函数DI)将其传递进去,因为通过解析架构来创建节点树需要大量复杂的代码-需要进行彻底测试的代码。我不想将其委托给“胶合”代码(这应该是相对琐碎的,并且可能不会被直接测试)。 我曾考虑过将代码创建节点树放在一个单独的“构建器”对象中,但是犹豫称它为“构建器”,因为它与“构建器模式”并不完全匹配(后者似乎与消除伸缩无关。构造函数)。但是,即使我将其称为其他名称(例如NodeTreeConstructor),也只是为了避免让ModelDef构造函数构建节点树而感到有些破绽。它必须建在某个地方。为什么不在要拥有它的对象中?

3
分散数据管理-将数据库封装到微服务中
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我最近参加了一门软件设计课程,并且最近对使用“微服务”模型进行了讨论/推荐,在该模型中,服务的各个组成部分被分成了尽可能独立的微服务子组件。 提到的一部分是,不是遵循一种常见的模型,即所有微服务都与之通信的单个数据库,而是为每个微服务运行一个单独的数据库。 可以在此处找到措辞更好且更详细的解释:http : //martinfowler.com/articles/microservices.html在“分散数据管理”部分下 最突出的部分是这样说的: 微服务更喜欢让每个服务管理自己的数据库,或者是相同数据库技术的不同实例,或者是完全不同的数据库系统-一种称为Polyglot Persistence的方法。您可以在整体中使用多语种持久性,但是在微服务中它的出现频率更高。 图4 我喜欢这个概念,除其他外,我认为这是对维护的一项重大改进,并且有多个人在其中进行项目。也就是说,我绝不是经验丰富的软件架构师。有没有人尝试实现它?您遇到了哪些好处和障碍?

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.