Questions tagged «design»

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

6
一种基于限制传递给函数的参数数量的语言
这个想法的灵感来自事实运算符,例如+,-,%等,可以看作是传递了一个或两个参数且没有副作用的函数。假设我或其他人编写了一种语言,该语言可以阻止传递两个以上的参数,并且也只能通过返回值来工作: a)这样的语言会导致更容易理解的代码吗? b)代码流程会更清晰吗?(被强制执行更多的步骤,可能会减少“隐藏”的互动 c)限制是否会使该语言在更复杂的程序中显得过于庞大。 d)(奖励)对优点/缺点的任何其他评论 注意: 仍然必须做出两个决定-第一个是是否允许用户在main()或其等效外部进行输入,以及关于传递数组/结构时将发生什么的规则。例如,如果某人希望单个函数添加多个值,则可以通过将其捆绑到数组中来解决该限制。可以通过不允许数组或结构与其自身进行交互来阻止这种情况,例如,仍然可以使您根据位置将每个数字除以不同的数量。

5
C ++中异常的惯用法
isocpp.org例外常见问题解答指出 不要使用throw来指示函数使用中的编码错误。使用断言或其他机制将流程发送到调试器中或使流程崩溃并收集崩溃转储供开发人员调试。 另一方面,标准库定义了std :: logic_error及其所有派生类,在我看来,它们似乎还应该处理编程错误。是否将空字符串传递给std :: stof(将抛出invalid_argument)不是编程错误?是否将包含不同于'1'/'0'字符的字符串传递给std :: bitset(将抛出invalid_argument)不是编程错误?使用无效索引调用std :: bitset :: set(会抛出out_of_range)不是编程错误吗?如果不是,那么将要测试的编程错误是什么?基于字符串的std :: bitset构造函数仅自C ++ 11起存在,因此在设计时应考虑惯用异常。另一方面,有人告诉我,从根本上不应该使用逻辑错误。 经常出现异常的另一个规则是“仅在特殊情况下使用异常”。但是,库函数应该如何知道哪些情况例外?对于某些程序,无法打开文件可能是一种例外。对于其他人,无法分配内存可能不是例外。中间有100多个案例。无法创建套接字?无法连接或将数据写入套接字或文件?无法解析输入?可能是例外,可能不是。该函数本身肯定通常不知道,它不知道在哪种上下文中调用它。 因此,我应该如何决定是否应为特定功能使用异常?在我看来,实际上唯一一致的方法是将其用于所有错误处理,或一无所有。而且,如果我使用的是标准库,那么该选择就是我自己做的。
16 design  c++  exceptions 

2
将清洁代码原则应用于功能语言
我目前正在阅读Robert Martin的Clean Code。我认为这很棒,在编写OO代码时,我会牢记他的课程。特别是,我认为他的建议是使用带有有意义名称的小函数,这使我的代码流程更加流畅。最好通过以下引用来总结: [W] e希望能够像读取一组TO段落一样阅读该程序,每个段落都描述了当前的抽象级别,并在下一层向下引用了后续的TO段落。 (清洁代码,第37页:“ TO段落”是一个以不定式表达的句子开头的段落。“要做X,我们执行步骤Y和Z。”“要做Y,我们...”等。 ) 例如: 对于RenderPageWithSetupsAndTeardowns,我们检查该页面是否为测试页面,如果是,则包括设置和拆卸。无论哪种情况,我们都以HTML呈现页面 我也为我的工作编写功能代码。马丁在书中的例子确实读起来好像是一段段落,而且非常清楚-但我不确定“读起来像一组段落”是否适合功能代码使用。 以Haskell标准库为例: maximumBy :: (a -> a -> Ordering) -> [a] -> a maximumBy _ [] = error "List.maximumBy: empty list" maximumBy cmp xs = foldl1 maxBy xs where maxBy x y = case cmp x y of GT -> …

6
面向对象设计中的松耦合
我正在尝试学习GRASP,我发现了有关低耦合的解释(在第3页上),当我发现这一点时,我感到非常惊讶: 考虑addTrack一个Album类的方法,两种可能的方法是: addTrack( Track t ) 和 addTrack( int no, String title, double duration ) 哪种方法可以减少耦合?第二个则需要,因为使用Album类的类不必知道Track类。通常,方法的参数应使用基本类型(int,char ...)和java。*包中的类。 我倾向于不同意这一点。我相信addTrack(Track t)胜于addTrack(int no, String title, double duration)各种原因: 最好总是使用尽可能少的参数的方法(根据Bob叔叔的“清洁代码”,最好是无或一个,在某些情况下为2,在特殊情况下为3;超过3的需求需要重构-这些当然是建议,而不是冬青规则) 。 如果addTrack是接口的一种方法,并且要求a Track应该具有更多的信息(例如年份或类型),则需要更改接口,以便该方法应支持另一个参数。 封装破裂;如果addTrack在接口中,则它不应该知道的内部Track。 实际上,它在第二种方式中与许多参数耦合在一起。假设no参数需要被改变,从int到long,因为有超过MAX_INT轨道(或无论何种原因); 则Track必须同时更改和方法,而如果addTrack(Track track)仅更改方法,则需要Track更改。 这四个参数实际上是相互关联的,其中一些是其他因素的结果。 哪种方法更好?

6
HTTP会话或数据库方法
我对应该采取的方法感到有些困惑,正在研究购物车的设计,我需要将购物车存储在会话中或数据库中,但不确定哪种方法是最佳方法。 用户未登录并将产品添加到购物车(匿名用户) 用户已登录并将产品添加到购物车。 第一种情况对我来说更令人困惑,因为在许多情况下,用户只是访问网上商店并在没有登录的情况下添加产品,很可能他可能不会进行结帐流程。 但是我们仍然需要为此用户创建一个购物车,为了创建和保存购物车,我有两个选择。 当用户添加产品时,请在数据库中创建一个购物车并将该购物车与该用户相关联,当他登录时将其移动到登录用户。 当用户登录数据库中的创建购物车并将该登录购物车的用户与用户相关联时,创建购物车,向其中添加产品并将其保存到会话中。 我知道无论是数据库驱动的Cart系统还是基于Session的方面都可能有积极的方面也有消极的方面,但是我不确定哪一个是考虑以下几点的最佳方法 可扩展性 灵活性 可扩展性 应用程序应注意速度 寻找有关此方面的信息以决定路径。

3
如何在PHP和MySql中处理货币值?
我继承了在MySQL数据库之上用PHP编写的大量旧代码。我注意到的是该应用程序doubles用于存储和处理数据。 现在,我遇到了许多帖子,提到double由于四舍五入的错误,它们不适合货币操作。但是,对于如何在PHP代码中处理货币值并将其存储在MySQL数据库中,我尚未找到完整的解决方案。 在专门用PHP处理资金时,是否有最佳实践? 我正在寻找的东西是: 数据应如何存储在数据库中?列类型?尺寸? 正常的加,减数据应如何处理。乘法还是除法? 我应该什么时候取整值?舍入多少舍入(如果有)? 处理大货币值和低货币值之间有区别吗? 注意: 一个非常简化的示例代码,说明了我在日常生活中可能会遇到的货币价值(为简化起见,忽略了各种安全问题。当然,在现实生活中,我永远不会像这样使用我的代码): $a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double? $b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1 $valueToBeStored= $a * $b; //--> any hint here is welcomed $valueFromDatabase= $row['price']; //--> price …

9
使用构造方法还是setter方法?
我正在编写具有Action类的UI代码,例如: public class MyAction extends Action { public MyAction() { setText("My Action Text"); setToolTip("My Action Tool tip"); setImage("Some Image"); } } 创建此Action类时,几乎可以假定Action该类是不可自定义的(从某种意义上说,它的文本,工具提示或图像在代码中的任何位置都不会更改)。现在,我们需要在代码中的某些位置更改动作文本。因此,我建议我的同事从构造函数中删除硬编码的操作文本,并接受它作为参数,以使每个人都被迫传递操作文本。类似于下面的代码- public class MyAction extends Action { public MyAction(String actionText) { setText(actionText); setTooltip("My Action tool tip"); setImage("My Image"); } } 但他认为,由于setText()方法属于基类,因此可以在创建操作实例的任何位置灵活地使用该方法传递操作文本。这样,无需更改现有的MyAction类。所以他的代码看起来像这样。 MyAction action = new MyAction(); //this creates action …

5
学习并发和多线程应用程序的最佳资源是什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 4年前关闭。 已锁定。这个问题目前不接受新的答案或互动。了解更多。 我意识到我在多线程应用程序和并发编程方面存在巨大的知识鸿沟。过去,我已经介绍了一些基础知识,但是大部分内容似乎都已遗忘,这绝对是我想要且需要了解的领域。 学习构建并发应用程序的最佳资源是什么?我是一个非常务实的人,因此,如果所说的书包含一些具体的例子会更好,但是我愿意提出建议。我个人更喜欢使用伪代码或C ++,并且最好还是偏向游戏开发,但不是必需的。

3
您是否应该同时使用C#和F#
我知道您可以在同一个项目中一起使用C#和F#,但是我不确定这样做是否是个好主意。 在我看来,将两种截然不同的编码样式(功能性与OOP)混合使用可能会导致设计缺乏凝聚力。它是否正确?
16 design  f# 

8
功能与功能[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 我经常听到项目经理(项目经理)谈论特性和功能。而且我很困惑要区分它们。有时我认为功能等同于用户故事。诸如“作为用户,鲍勃应该能够看到他的付款清单”之类的东西,他们称其为功能。有时它变得像子系统一样大,例如“通过Web应用程序发送SMS的能力”。另一方面,功能有时会像“为数字输入实现数字分组”这样的任务一样小,而在某些情况下,它会像整个CRUD操作一样大。 我的问题是,如何区分功能和功能?

22
您应该在什么时候开始考虑性能?
在构建应用程序时,我发现自己不断在问这是否是执行或实现某些功能的最佳方法。通常,我会在stackoverflow或其他论坛上发布问题,仅希望收到反馈,以便收到有关如何不“把马放到马前”有关性能的评论。大多数程序员在应用程序完成之前是否真的没有考虑性能,还是性能绝对不能接受?我的意思是,我了解开发环境与生产环境不同,您不应该完全依赖开发笔记本电脑的结果...但是,有些实践和技术可以提供比其他产品更好的性能。 在整个开发过程中考虑性能是不好的做法吗?在性能真正下降之前,我应该推迟考虑这些因素吗? 更新资料 明确地说,我是在谈论您正在考虑或即将使用某些功能的情况。您知道有几种实现方法,但是您不确定每个实现的扩展程度。另外,可能还有几种您不熟悉的技术。在较小的规模上,任何一种方法都可能是适当的,但是在较大的规模上,某些方法会跟上,有些则不会。通常,当我征求意见或指导时,答复是:以后再担心...

4
我在哪里可以找到设计练习?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我觉得继续练习解决问题的技能很重要。编写自己的微型项目是一种方法,但另一种方法是尝试解决在线发布的问题。在线查找有趣的编程测验很容易,这些测验需要应用聪明的算法来解决- 欧拉计画是一个著名的例子。 但是,在许多现实生活中的项目中,软件的设计(尤其是在初始阶段)具有很大的影响力,在后期阶段,它不能像普通算法那样容易地进行调整。为了提高这些技能,我正在寻找设计问题的任何集合。 当我说“设计”时,我指的是软件解决方案的抽象设计-例如,将存在哪些模块以及它们之间的依赖关系是什么,数据如何在程序中流动,什么样的数据需要保存在程序中?设计问题是那些在任何项目的早期阶段都必须解决的关键问题,但解决方案是没有一行代码的白板图。 当然,这类问题没有一个正确的解决方案,但是我对在任何地方都能显示出可用于解决问题的典型解决方案的利弊的地方感到特别满意。

2
数据验证:是否是分隔类?
当我有大量需要验证的数据时,我应该仅出于验证目的创建一个新类,还是应该坚持方法内验证? 我的特定示例设想了一个锦标赛和一个事件/类别类:Tournament和Event,它模拟了一个体育锦标赛,每个锦标赛都有一个或多个类别。 这些类别中有很多事情需要验证:球员应该为空,应该是唯一的,每个球员应该参加的比赛数量,每次比赛都有的球员数量,预定义的对决,以及包括许多其他东西在内的非常重要的事情。复杂的规则。 我还需要整体验证某些部分,例如类如何相互集成。例如,对a Player进行单一验证就可以了,但是如果一个事件两次具有相同的玩家,那就是验证错误。 那怎么办呢::使用模型类的设置器和类似方法添加数据时,我完全忘记了任何预检查,而是让验证类来处理。 因此,我们将有类似EventValidator与Event作为成员,和validate()用来验证整个对象的方法,再加上单一的方法来验证所有成员的规则。 然后,在实例化有效对象之前,我将执行验证以防止出现非法值。 我的设计正确吗?我应该做些不同的事情吗? 另外,我应该使用布尔值返回验证方法吗?或者,如果验证失败,则抛出异常?在我看来,最好的选择是布尔返回方法,并在实例化对象时引发异常,例如: public Event() { EventValidator eventValidator = new EventValidator(this); if (!eventValidator.validate()) { // show error messages with methods defined in the validator throw new Exception(); // what type of exception would be best? should I create custom ones? } }
16 java  design  data  validation 

6
远离设计人员的“代码”?
我和我的一个朋友建立了很多项目,但我们总是一遍又一遍地遇到同样的陷阱。我知道如何编写PHP,Javascript以及所有其他内容(我也知道CSS和HTML),因此在构建实际功能时我可以完成大部分工作。但是,他不能,但是他可以做我几乎做不到的事情:设计站点。 但是每次,我们偶然发现一个问题,因为他不知道如何编写代码,所以这通常会大大减慢我们的开发速度。目前,这是我们的工作流程: 我们提出一个功能 他负责构建前端设计(应将其放置在哪里,外观如何等)。 他将完整的模板发送给我(Pinegrow的HTML导出) 我寻找他所做的更改,然后在实际站点中实现它们(自几周以来,我一直在使用CakePHP)。 当某件事情无法按预期进行时(例如,由于某种原因我们未能按计划完成),我将问题解决了,然后将模板发回给他 冲洗并重复 可以想象,这个过程非常缓慢且效率低下。所以我的问题是,我们如何才能使这一过程更加顺利?我已经看到了很多关于应该使用React并使用RESTful的东西,但我们不想要,但是我们想使用CakePHP。有人可以指导我一些有用的资源吗?我一直在寻找这个问题已经有一段时间了,但是从来没有找到一个合适的解决方案。 基本上,我的伙伴可以做的就是设计网站。他不能使用Docker(我一直都在使用Docker),PHP,Javascript以及几乎所有其他内容(他确实知道一些CSS,但是大多数情况下可以与WYSIWYG编辑器一起使用),我愿意向他学习,但是他是不感兴趣(所以我对此表示尊重)。我希望这里的人可以帮助我(可能以后还会有人回答这个问题),因为我认为这是一件很重要的事情。
15 design  cakephp 

6
策略模式的优势
如果仅在if / then情况下编写代码,使用策略模式为什么有好处? 例如:我有一个TaxPayer类,它的一种方法使用不同的算法来计算税收。那么,为什么不具有if / then情况并找出在该方法中使用哪种算法而不是使用策略模式呢?另外,为什么不能只为TaxPayer类中的每个算法实现单独的方法? 另外,算法在运行时更改意味着什么?

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.