Questions tagged «design»

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


16
如何处理分析瘫痪?
很多时候,我在选择最佳设计决策时陷入困境。即使对于小的细节,例如函数定义,控制流和变量名,我也会花费很长的时间仔细研究我所选择的收益和权衡。 我觉得我花了很多时间在诸如此类的无关紧要的细节上而失去了很多效率。即使我知道,如果当前的设计无法解决,我可以更改这些内容,但我很难确定一个选择。 我应该怎么做才能解决这个问题?

8
如果项目中没有设计人员,开发人员是否应该进行UI原型设计?
我正在与一个创建专有Web应用程序的小团队一起工作,而UX并不是一个优先事项,因为我们自己的人将是操作它的人,但是我们确实努力使他们的工作更轻松。 作为开发人员,我是否应该在开始创建新屏幕之前创建UI样机?没什么特别的,主要是为了与同事讨论并拥有参考模型的总体布局。在盲目的研究代码之前,我将它与创建一些UML图进行了比较。 我的一位同事说这很荒谬,不是我的工作。

12
捕获一般异常真的是一件坏事吗?
我通常同意大多数代码分析警告,并且我会坚持遵守。但是,我在这方面遇到了困难: CA1031:不捕获常规异常类型 我了解此规则的理由。但是,在实践中,如果无论是否引发异常,我都想采取相同的措施,为什么我要专门处理每一个?此外,如果我处理特定的异常,如果我正在调用的代码发生更改以在将来引发新的异常,该怎么办?现在,我必须更改代码以处理该新异常。而如果我只是抓住了Exception我的代码就不必更改。 例如,如果Foo调用Bar,并且Foo不管Bar抛出的异常类型如何都需要停止处理,那么具体确定我要捕获的异常类型是否有任何优势? 也许是一个更好的例子: public void Foo() { // Some logic here. LogUtility.Log("some message"); } public static void Log() { try { // Actual logging here. } catch (Exception ex) { // Eat it. Logging failures shouldn't stop us from processing. } } 如果您在此处未捕获到一般异常,则必须捕获所有可能的异常类型。帕特里克(Patrick)有一个优点,OutOfMemoryException不应以这种方式处理。那么,如果我想忽略所有例外情况OutOfMemoryException呢?
56 c#  design  exceptions 

10
在什么情况下,更少的代码更好?[关闭]
我最近在工作中重构了一些代码,并且我认为自己做得很好。我将980行代码减少到450行,并将类数量减半。 当向我的同事展示时,有些人不同意这是一种进步。 他们说-“更少的代码行不一定更好” 我可以看到,在某些极端情况下,人们会写很长的行和/或将所有内容放在一个方法中以节省几行,但这不是我要做的。在我看来,由于代码只有一半大小,因此其结构合理且易于理解/维护。 我正在努力地弄清楚为什么有人希望将完成工作所需的代码加倍,而且我想知道是否有人会觉得与我的同事一样,并且可以提出一些理由,使事半功倍?

6
事件循环是否只是具有优化轮询的for / while循环?
我试图了解什么是事件循环。通常的解释是,在事件循环中,您会做一些事情,直到收到事件发生的通知。然后,您可以处理事件并继续做之前的工作。 用示例映射以上定义。我有一台在事件循环中“侦听”的服务器,当检测到套接字连接时,将读取并显示其中的数据,此后服务器将像以前一样继续/开始监听。 但是,此事件正在发生,而我们收到的通知“就像那样”对我来说就很大了。您可以说:“注册事件侦听器不只是那样而已”。但是什么是事件侦听器,但由于某种原因没有返回的函数。它是否在自己的循环中,等待事件发生时得到通知?事件监听器是否还应该注册一个事件监听器?它在哪里结束? 事件是可以使用的很好的抽象,但是仅仅是一个抽象。我认为,最后不可避免地要进行投票。也许我们没有在代码中执行此操作,但是较低级别(编程语言实现或OS)正在为我们执行此操作。 它基本上可以归结为以下伪代码,这些伪代码在足够低的位置运行,因此不会导致繁忙的等待: while(True): do stuff check if event has happened (poll) do other stuff 这是我对整个想法的理解,我想听听这是否正确。我乐于接受整个想法从根本上是错误的,在这种情况下,我希望有正确的解释。

10
这是什么意思?“用户不应该决定它是否是管理员。特权或安全系统应如此。”
问题中使用的示例将最少的数据传递给函数,以确定是否用户是管理员的最佳方法。一个常见的答案是: user.isAdmin() 这引起了评论,该评论被重复了多次并被多次投票: 用户不应该确定它是否是管理员。特权或安全系统应该。与课程紧密联系并不意味着将其纳入课程是一个好主意。 我回答, 用户没有决定什么。用户对象/表存储有关每个用户的数据。实际用户不会改变自己的一切。 但这没有效果。显然,存在潜在的视角差异,这导致沟通困难。有人可以向我解释为什么user.isAdmin()不好,并绘制一个简短的草图来“完成”吗? 确实,我看不到将安全与受保护系统分开的优势。任何安全性文字都将要求从一开始就将安全性设计到系统中,并在开发,部署,维护乃至报废的每个阶段都要加以考虑。它不是可以固定在侧面的东西。但到目前为止,此评论有17票赞成票,表明我错过了一些重要的内容。

13
如何停止浪费时间设计建筑[关闭]
我最近刚从大学毕业,开始从事程序员工作。我发现解决“技术”问题或用我说有1个解决方案的东西进行调试并不困难。 但是似乎有一类问题没有一个明显的解决方案,例如软件体系结构。这些事情使我困惑,使我感到极大的困扰。 我花了数小时的时间来尝试确定如何“架构”我的程序和系统。例如-我是否将此逻辑划分为1或2个类,如何命名这些类,是否应该将其设为私有或公开类,等等。这些问题占用了我很多时间,这使我感到非常沮丧。我只想创建程序-该死的体系结构。 我如何才能更快地完成架构阶段并进入自己喜欢的编码和调试阶段?

9
为什么不公开主键
在我的教育中,我被告知将真实的主键(不仅是DB密钥,而且是所有主访问器)公开给用户,这是一个错误的想法。 我一直认为这是一个安全问题(因为攻击者可能会尝试读取自己的东西,而不是自己的东西)。 现在,我必须检查是否无论如何都允许用户访问,所以背后有其他原因吗? 另外,由于我的用户无论如何都必须访问数据,因此我需要在两者之间的某个外部世界拥有一个公共密钥。现在,公用密钥与主密钥存在相同的问题,不是吗? 人们一直要求有一个示例说明为什么仍然要这样做,所以这里是一个。请记住,这个问题不仅涉及原理本身,而且要在本示例中应用。明确欢迎解决其他情况的答案。 处理活动的应用程序(Web,移动设备)具有多个UI和至少一个用于系统间通信的自动API(例如,会计部门希望根据已完成的操作向客户收取多少费用)。该应用程序有多个客户,因此必须将其数据分开(从逻辑上讲,数据存储在同一数据库中)。无论如何,都会检查每个请求的有效性。 活动是非常精细的,因此它在某个容器对象中在一起,可以称之为“任务”。 三个用例: 用户A希望将用户B发送给某个任务,因此他向他发送了一个链接(HTTP)以在其中完成一些活动。 用户B必须走出建筑物,以便他在移动设备上打开任务。 会计部门希望向客户收取该任务的费用,但使用第三方会计系统,该系统通过引用REST-API的某些代码自动加载任务/活动 每个用例都要求(或变得更加容易)代理为任务和活动提供一些可寻址的标识符。

4
TDD-由内而外由内而外
使用TDD 构建应用程序Inside In与使用Inside Out构建应用程序有什么区别? 这些是我阅读的有关TDD和单元测试的书: 测试驱动开发:示例 测试驱动开发:实用指南:实用指南在Microsoft中开发 高质量PHP框架和应用程序的实际解决方案 。 NET xUnit测试模式:重构测试代码 单元测试的技巧:以.Net为例 ,以测试为指导的不断增长的面向对象软件中的示例 --->因为JAVA不是我的主要语言,所以这真的很难理解:) 通常,几乎所有的人都解释了TDD的基础知识和单元测试,但是很少提及构建应用程序的不同方式。 我注意到的另一件事是,这些书中的大多数(如果不是全部)在编写应用程序时都会忽略设计阶段。他们更多地专注于快速编写测试用例并让设计自行出现。 但是,我遇到了xUnit测试模式中的一段,该段讨论了人们处理TDD的方式。有2所学校在外面,在内部与内部。 遗憾的是,这本书没有对此进行详细说明。我想知道这两个案例的主要区别是什么。 什么时候应该使用它们中的每一个? 对于TDD初学者来说,哪个更容易掌握? 每种方法的缺点是什么? 有没有专门讨论该主题的材料?

12
如何退后一步,以崭新的眼光看代码?[关闭]
去年,我以一个人的团队工作,开发了一个富客户端应用程序(价值35,000多个LoC)。目前处于稳定状态并已投入生产。但是,我知道我的技能在项目开始之初就生锈了,因此毫无疑问,代码中存在重大问题。在这一点上,大多数问题都在架构,结构和交互方面-容易的问题,甚至是架构/设计问题,已经被淘汰。 不幸的是,我在这个项目上花费了很多时间,以至于我难以思考它之外的问题-从一个新的角度来处理它,以查看深层掩盖或固有于设计中的缺陷。 我该如何超越自己的头脑和代码范围,以使外观焕然一新并变得更好?

11
如何避免级联重构?
我有一个项目。在此项目中,我希望对其进行重构以添加功能,并且对项目进行重构以添加功能。 问题是,当我完成后,原来我需要做一个小的接口更改以适应它。所以我做了改变。然后,就新类而言,无法使用其当前接口来实现消费类,因此它也需要一个新接口。现在已经三个月了,我不得不解决了几乎不相关的无数问题,而且我正在寻找解决从现在开始经过一年规划的问题,或者只是因为困难而列为无法解决的问题,然后再进行编译再次。 将来如何避免这种级联重构?这仅仅是我以前的课程互相依赖的一种征兆吗? 简要编辑:在这种情况下,重构就是功能,因为重构增加了特定代码的可扩展性并减少了一些耦合。这意味着外部开发人员可以做更多的事情,而这正是我想要提供的功能。因此,原始重构本身不应该是功能上的更改。 我五天前承诺的更大修改: 在开始重构之前,我有一个带有接口的系统,但是在实现中,我只是简单地dynamic_cast通过了所有可能的实现。显然,这意味着您不能一方面从接口继承,其次,对于没有实现访问权即可实现此接口的任何人,这都是不可能的。因此,我决定要解决此问题并开放供公众使用的界面,以便任何人都可以实施,而实施该界面是整个合同所必需的-显然是一项改进。 当我发现并用火杀死所有地方时,我发现一个地方被证明是一个特殊的问题。它取决于所有各种派生类的实现细节以及已经实现但在其他地方更好的重复功能。它可以代替公共接口来实现,而可以重新使用该功能的现有实现。我发现它需要特定的上下文才能正常运行。粗略地说,调用先前的实现看起来像 for(auto&& a : as) { f(a); } 但是,要获得此上下文,我需要将其更改为更类似的内容 std::vector<Context> contexts; for(auto&& a : as) contexts.push_back(g(a)); do_thing_now_we_have_contexts(); for(auto&& con : contexts) f(con); 这意味着对于以前曾经是其中一部分的所有操作f,其中一些操作需要成为g无需上下文的新功能的一部分,而其中某些操作则需要由现在延迟的一部分组成f。但是,并非所有方法都f调用需要或需要此上下文-其中一些需要通过单独的方式获得的独特上下文。因此,对于f最终调用的所有内容(大致来说,几乎所有内容),我必须确定他们需要的上下文(如果有的话),应该从哪里获取以及如何将它们从旧f分为新f与新g。 这就是我最终所处位置的方式。我一直坚持下去的唯一原因是因为无论如何我都需要这种重构。

15
在没有编写代码的情况下思考几天的设计问题是否正常?[关闭]
有时我茫然地凝视着空间或勾勒出想法,然后在纸上写下一些伪代码。然后我将其擦除并重新开始,然后,当我认为自己有解决问题的正确方法时,我便开始编写代码。 想几天不写任何代码是正常的吗?这是否表明我正在完全解决问题?没有在我的IDE中编写任何有形的代码使我感到紧张。
52 design 

1
您如何用Haskell或其他功能编程语言设计程序?
我在面向对象的编程语言(例如C#或ruby)方面有一些经验。我知道如何设计面向对象风格的程序,如何创建类和对象,以及如何定义它们之间的关系。我也知道一些设计模式。 人们如何编写功能程序?他们如何开始?有功能语言的设计模式吗?极限编程或敏捷开发等方法是否适用于功能语言?

9
您是否应该防止来自外部API的意外值?
可以说,您正在编码一个从外部API接收输入的函数MyAPI。 该外部API MyAPI的合同规定其将返回string或number。 它是推荐的防范之类的东西null,undefined,boolean等即使它不属于API的一部分MyAPI?特别是,由于您无法控制该API,因此无法通过诸如静态类型分析之类的方法来做出保证,因此,安全起来总比对不起好。 我在考虑稳健性原则。

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.