Questions tagged «design»

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

16
项目已接近完成,但程序上有意粉代码。我要重写还是继续尝试发送?[关闭]
我是一名初学者Web开发人员(一年的经验)。 毕业几周后,我得到了一份工作,为一家所有者不是很多技术人员的公司构建Web应用程序。他招募我是为了避免他的想法失窃,服务公司收取高昂的开发成本,并希望他有一个年轻的人来长期维护该项目(我被录用后很久才得出这些结论)。 当时我还是Cocky,拥有计算机科学文凭,我接受了这个提议,认为我可以构建任何东西。 我在做主。经过一些研究,我选择了PHP,并从纯PHP开始,没有对象,只有丑陋的过程代码。两个月后,一切都变得混乱了,很难取得任何进展。Web应用程序非常庞大。因此,我决定检查一个MVC框架,这将使我的生活更轻松。那就是我偶然发现PHP社区中一个很酷的孩子的地方:Laravel。我喜欢它,它很容易学习,因此我立即开始编码。我的代码看起来更简洁,更有条理。看起来很好。 但是同样,Web应用程序非常庞大。该公司迫使我交付第一个版本,显然他们希望部署该版本并开始寻找客户。 因为Laravel很有趣,所以让我想起了为什么我首先选择了这个行业-在陷入糟糕的教育体系时我忘记了这一点。 因此,我从晚上开始从事小型项目,了解方法和最佳实践。我回顾了OOP,然后进行了面向对象的设计和分析,并阅读了Bob叔叔的书Clean Code。 这使我意识到我真的一无所知。我不知道如何正确地构建软件。但是到现在为止为时已晚,现在我快完成了。我的代码根本不是干净的,仅仅是意大利面条式的代码,是修复错误的真正痛苦,所有逻辑都在控制器中,并且几乎没有面向对象的设计。 我一直坚持认为我必须重写整个项目。但是,我做不到……他们一直在问什么时候才能完成。 我无法想象此代码部署在服务器上。另外,我仍然对代码效率和Web应用程序的性能一无所知。 一方面,公司正在等待产品,不能再等待了。另一方面,我看不到实际代码会更进一步。我可以完成,总结并部署,但是上帝只知道人们开始使用它时会发生什么。 我要重写还是继续尝试发送,还是错过了另一个选择?

17
过早的优化真的是万恶之源吗?
我的一位同事今天提交了一个名为的类ThreadLocalFormat,该类基本上将Java Format类的实例移动到了线程本地中,因为它们不是线程安全的,而且创建起来“相对昂贵”。我写了一个快速测试,计算出我每秒可以创建200,000个实例,问他是否创建了那么多实例,对此他回答“远不及那么多”。他是一位出色的程序员,并且团队中的每个人都非常熟练,因此我们对所生成的代码毫无疑问,但这显然是在没有实际需要的情况下进行优化的情况。他应我的要求取消了代码。你怎么看?这是“过早优化”的案例吗,真的有多糟糕?

18
一个人如何管理上千条IF ... THEN ... ELSE规则?
我正在考虑构建一个应用程序,该应用程序的核心是数千个if ... then ... else语句。该应用程序的目的是能够预测奶牛在任何景观中如何移动。他们受到太阳,风,食物来源,突发事件等的影响。 如何管理这样的应用程序?我想象在经过数百个IF语句之后,程序将如何响应并调试导致某种反应的结果将意味着每次必须遍历整个IF语句树,这将是无法预测的好。 我已经阅读了一些有关规则引擎的内容,但是我看不到它们如何克服这种复杂性。

15
使用布尔参数确定行为是否错误?
我不时看到一种“感觉”错误的做法,但是我不能很清楚地指出它的错误之处。也许这只是我的偏见。开始: 开发人员定义一个使用布尔值作为其参数之一的方法,然后该方法调用另一个,依此类推,最终使用该布尔值,仅用于确定是否要执行特定操作。例如,仅当用户具有某些权限时,或者如果我们(或不在)测试模式,批处理模式或实时模式下,或者仅当系统处于运行状态时,才可以使用此权限来执行操作一定的状态。 嗯,总有另一种方法可以做到,无论是通过查询何时该采取行动(而不是传递参数),还是通过该方法的多个版本或该类的多个实现,等等。我的问题是与其说如何改善它,不如说是真的不对(正如我怀疑的那样),如果真的对的话,那是什么问题。

17
始终拥有一个自动增量整数主键是一种好习惯吗?
在我的数据库中,我倾向于养成使用自动递增的整数主键的习惯,该主键带有id我制作的每个表的名称,以便对任何特定的行进行唯一的查找。 这是一个坏主意吗?这样做有什么弊端吗?有时我会拥有多个指标喜欢id, profile_id, subscriptions这里id是唯一的标识符,profile_id链接到国外id一的Profile表等 还是在某些情况下您不想添加这样的字段?

5
设计命令行参数的良好习惯是什么?
在开发应用程序时,我开始怀疑-我应该如何设计命令行参数? 很多程序都使用公式是这样-argument value或/argument value。我想到的解决方案是argument:value。我认为这是很好的,因为没有空格就无法将值和参数弄乱。同样,很容易将字符串从左:字符的第一个字符拆分为两个。 我的问题是: 流行的-argument value公式是否比argument:value(更易读,更容易编写,没有错误,更易于专家开发人员理解)更好? 在设计命令行参数时,是否应该遵循一些众所周知的规则(如果可行,可以的话)? 要求提供更多详细信息,我将提供它。但是,我认为它们不应影响答案。问题在于总体上的良好习惯。我认为它们对于各种应用程序都是相同的。 我们正在开发一个将在公共场所(触摸图腾,桌子)使用的应用程序。应用程序是使用Qt Quick 5(C ++,QML,JS)编写的。设备将安装Windows 8.1 / 10。我们将提供前端界面来管理设备。但是,某些高级管理员可能希望自己配置应用程序。从业务的角度来看这不是很重要,但是正如我同意Kilian Foth所说的那样,我不希望我的应用程序给用户带来麻烦。在互联网上找不到我想要的内容。 对于更高级的Stack Exchange用户:我希望这个问题笼统。也许它符合社区Wiki的资格(我不知道是否可以将现有问题转换为答案)。因为我希望这个问题与操作系统和编程语言无关,所以这里出现的答案对于其他开发人员来说可能是一个宝贵的教训。
190 design  parameters  cli 

5
什么时候使用结构而不是类?[关闭]
您何时使用结构与类的经验法则是什么?我正在考虑这些术语的C#定义,但是如果您的语言具有类似的概念,我也想听听您的意见。 我倾向于对几乎所有东西使用类,并且仅在某些东西非常简单并且应该是值类型(例如PhoneNumber或类似的东西)时才使用structs。但这似乎是一个相对较小的用途,我希望有更多有趣的用例。
174 c#  design  class  struct 

21
快速又肮脏的程序员如何知道他们做对了?
如果您问程序员为什么他们应该编写简洁的代码,那么获得的第一答案就是可维护性。尽管这是我的清单,但我的主要原因是更直接,更无私的:如果太脏,我无法确定我的新代码是否正确。我发现我已经非常专注于单个函数和代码行,以至于当我完成初稿并再次查看大图时,有时并不能很好地融合在一起。花一两个小时进行清洁重构通常会发现在草稿中很难检测到的复制/粘贴错误或边界条件。 但是,有些人认为为了运输软件的利益,有意偶尔检查脏代码是可以的,并计划“稍后对其进行清理”。当可读性不理想时,是否有某种可行的技术可以使他们对代码的正确性充满信心?这是值得尝试发展的技能吗?还是人们对代码缺乏信心会使某些人容易接受?
166 design 

8
在软件行业中典型的不良编程习惯是吗?[关闭]
一个月前,我刚开始担任软件开发人员的第一份工作。我所学到的有关OOP,SOLID,DRY,YAGNI,设计模式,SRP等的所有信息都可以丢到窗外。 他们使用C#.NET Webforms并使用很少的外部类(绝对不称为对象)来执行“代码隐藏”中的几乎所有操作。他们确实使用自定义控件并重复使用它们。关于唯一使用的对象是Entity Framework。他们为每个客户端重用代码隐藏。他们有400行长的方法来处理所有类型的工作。对于新客户端,他们采用aspx和aspx.cs并剥离客户端代码,然后开始添加新的特定于客户端的代码。 他们的第一个借口是增加额外的维护,更多的代码就是更多的维护。这是一家包括我在内的三个开发商的小商店。一个开发人员拥有30多年的经验,而另一个则拥有20多年的经验。一个曾经是游戏开发人员,另一个曾经一直使用C和C ++工作。 这在软件行业中有多普遍?我如何确保自己掌握OOP和相关原则?我在业余时间进行练习,我觉得我真的需要在一个经验丰富的开发人员下工作,以更好地使用OOP。

8
我如何让人们停止骑车流洒(专注于琐事)?
我的任务是教其他团队一个新的代码库,但是我一直遇到问题。每当我真正与人一起阅读代码时,在整个练习进行到无谓骑车(组织成员对琐碎问题的重视不成比例)之前,我们就走得很近。由于他们不了解代码库,但是认为他们需要帮助改进代码库,因此他们将重点放在可以理解的方面: Why is that named that? (2分钟以解释为什么如此命名,10分钟以内辩论一个新名称) Why is that an abstract base class rather than an interface? (2分钟的解释时间,超过10分钟的时间辩论该决定的相对价值) ...等等。现在,请不要误解我的意思-好的名字和好的,一致的设计很重要,但是我们永远也不会讨论代码的实际作用或如何以任何有意义的方式设计系统。我做了一些会议裁判,以使人们摆脱这些切线,但是他们走了-对固定琐碎琐事的代码将会/应该的注意力分散了,他们错过了更大的前景。 因此,我们稍后再试一次(或在代码库的其他部分进行尝试),由于人们没有足够的知识来克服自行车脱落的影响,因此重复进行。 我试过更小的群体,做大组,密码,白板,Visio图表,文字的巨墙,让他们只是把它认为死刑,立即切断短...参数帮助一些比别人多,但没有任何作品。地狱,我什至试图让团队中的其他人对此进行解释,因为我认为这可能是我不善于解释事物。 那么,您如何对其他程序员进行足够的教育,以使他们不再专注于琐碎的事,并可以对设计做出有意义的贡献?

7
搜索如何适合RESTful接口?
在设计RESTful接口时,请求类型的语义被认为对设计至关重要。 GET-列表收集或检索元素 PUT-替换集合或元素 POST-创建集合或元素 DELETE-好吧,erm,删除集合或元素 但是,这似乎没有涵盖“搜索”的概念。 例如,在设计一套支持求职网站的Web服务时,您可能具有以下要求: 获取个人招聘广告 GET来domain/Job/{id}/ 创建招聘广告 发布到domain/Job/ 更新职位广告 PUT到domain/Job/ 删除招聘广告 删除到domain/Job/ “获得所有工作”也很简单: GET来domain/Jobs/ 但是,工作“搜索”如何落入这种结构? 您可以声称这是“列表集合”的变体,并实现为: GET来domain/Jobs/ 但是,搜索可能很复杂,完全有可能产生一个生成长GET字符串的搜索。也就是说,在这里引用SO问题,使用GET字符串的长度超过2000个字符存在一些问题。 一个示例可能是多面搜索-继续“工作”示例。 我可能会在以下方面进行搜索-“技术”,“职位名称”,“学科”以及自由文本关键字,工作年龄,位置和薪水。 凭借流畅的用户界面和大量技术和职务,搜索可以包含大量方面的选择是可行的。 通过将此示例调整为简历而不是职位,可以带来更多的方面,您可以很容易地想象出搜索时选择了100个方面,甚至只是40个方面(每个方面50个字符)(例如,职务,大学名称,雇主名称)。 在那种情况下,可能需要移动PUT或POST,以确保将正确发送搜索数据。例如: 发布到domain/Jobs/ 但是从语义上讲,这是创建集合的指令。 您也可以说这将表示为搜索的创建: 发布到domain/Jobs/Search/ 或(如下面的燃烧语法所建议) 发布到domain/JobSearch/ 从语义上看,这似乎很有意义,但是您实际上并没有创建任何东西,而是在请求数据。 因此,从语义上讲,这是一个GET,但不能保证GET支持您所需要的。 因此,问题是-尝试尽可能地遵循RESTful设计,同时确保我保持在HTTP的限制之内,最适合搜索的设计是什么?

17
我怎么知道我的方法应该是可重用的?[关闭]
我在家照顾自己的生意,妻子来找我说 亲爱的..您可以在控制台中打印2018年全球所有的日光节约时间吗?我需要检查一下。 我非常高兴,因为那是我一直在等待一生的Java经验,并提出了: import java.time.*; import java.util.Set; class App { void dayLightSavings() { final Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); availableZoneIds.forEach( zoneId -> { LocalDateTime dateTime = LocalDateTime.of( LocalDate.of(2018, 1, 1), LocalTime.of(0, 0, 0) ); ZonedDateTime now = ZonedDateTime.of(dateTime, ZoneId.of(zoneId)); while (2018 == now.getYear()) { int hour = now.getHour(); now = now.plusHours(1); …

10
这是否违反了《里斯科夫换人原则》?
假设我们有一个Task实体列表和一个ProjectTask子类型。任务可以随时关闭,除非ProjectTasks状态为“已启动”的任务无法关闭。用户界面应确保关闭启动选项ProjectTask永远不会可用,但是域中存在一些保护措施: public class Task { public Status Status { get; set; } public virtual void Close() { Status = Status.Closed; } } public class ProjectTask : Task { public override void Close() { if (Status == Status.Started) throw new Exception("Cannot close a started Project Task"); base.Close(); } } 现在,在调用Close()Task时,如果调用ProjectTask处于启动状态,则有可能失败,而如果它是基本Task,则调用不会失败。但这是业务需求。它应该失败。可以认为这违反了Liskov替代原则吗?

14
方法对您来说理想的长度是多少?[关闭]
在面向对象的程序设计中,方法的最大长度当然没有确切的规则,但是我仍然发现这两个引号有些矛盾,因此我想听听您的想法。 罗伯特·马丁(Robert Martin)在《干净代码:敏捷软件工艺手册》中说: 功能的第一个规则是它们应该很小。功能的第二个规则是它们应该小于该值。函数不能长100行。函数几乎不应超过20行。 并列举了肯特·贝克(Kent Beck)的Java代码示例: 他程序中的每个函数只有两行,三行或四行。每个明显透明。每个人都讲一个故事。每个人都以引人注目的顺序将您引向了下一个。那就是您的功能应该有多短! 这听起来不错,但另一方面,在“代码完成”中,史蒂夫·麦康奈尔(Steve McConnell)说了很不一样的话: 例程应允许有机增长到100-200行,数十年的证据表明,这种长度的例程不会比较短的例程容易出错。 他还提到了一项研究,该研究说65行或更长的例程开发起来比较便宜。 因此,尽管对此事有不同意见,但您是否有实用的最佳实践?

11
执行错误处理的现代方法…
我已经思考了一段时间了,发现自己不断发现警告和矛盾,因此我希望有人可以得出以下结论: 优先于错误代码的异常 据我所知,在从事该行业工作四年,阅读书籍和博客等之后,当前处理错误的最佳实践是抛出异常,而不是返回错误代码(不一定返回错误代码,而是返回错误代码)。类型代表错误)。 但是-对我来说这似乎是矛盾的... 编码接口,而不是实现 我们对接口或抽象进行编码以减少耦合。我们不知道或不想知道接口的特定类型和实现。那么,我们怎么可能知道应该寻找哪些异常呢?该实现可以抛出10个不同的异常,也可以不抛出任何异常。当我们确实捕获到异常时,我们正在对实现进行假设? 除非-接口具有... 异常规格 某些语言允许开发人员声明某些方法会引发某些异常(例如,Java使用throws关键字。)从调用代码的角度来看,这似乎很好-我们明确知道可能需要捕获哪些异常。 但是-这似乎表明... 泄漏抽象 为什么接口应该指定可以引发哪些异常?如果实现不需要引发异常或引发其他异常怎么办?在接口级别,无法知道实现可能要抛出的异常。 所以... 总结一下 当异常(在我看来)与软件最佳实践相矛盾时,为什么还要优先考虑它们?而且,如果错误代码非常糟糕(并且我不需要在错误代码的恶习上卖掉),还有其他选择吗?满足(如上所述)最佳实践要求但不依赖于调用代码检查错误代码返回值的错误处理技术的当前(或即将成为最新技术)是什么?

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.