Questions tagged «design»

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

6
硬编码永远不变的字符串
因此,在我为法语编写一个用于共轭动词的程序(通过算法,而不是通过数据集)的过程中,我遇到了一个小问题。 对于动词的大约17种情况,使动词共轭的算法实际上非常简单,并且针对每种情况在特定模式下运行;因此,这17个类的共轭后缀是静态的,并且(很可能)不会很快改变。例如: // Verbs #1 : (model: "chanter") terminations = { ind_imp: ["ais", "ais", "ait", "ions", "iez", "aient"], ind_pre: ["e", "es", "e", "ons", "ez", "ent"], ind_fut: ["erai", "eras", "era", "erons", "erez", "eront"], participle: ["é", "ant"] }; 这些是法语中最常见的动词类的屈折后缀。 还有其他动词类别(不规则动词),其动词变位也很可能在下一两个世纪保持不变。由于它们是不规则的,因此它们的完整共轭必须静态地包含在内,因为它们不能从某个模式中可靠地进行共轭(据我的统计,也只有32个不规则)。例如: // "être": forms = { ind_imp: ["étais", "étais", "était", "étions", "étiez", "étaient"], …
39 design  strings 

12
OOP中的文档应避免指定“ getter”是否执行任何计算?
我学校的CS程序避免了任何有关面向对象编程的问题,所以我一直在自己做一些阅读来补充它-特别是Bertrand Meyer的面向对象软件构造。 Meyer反复指出,类应隐藏尽可能多的有关其实现的信息,这是有道理的。特别是,他反复指出,属性(即类的静态,非计算属性)和例程(与函数/过程调用相对应的类的属性)应该是无法区分的。 例如,如果一个类Person具有属性age,他断言,它应该是不可能告诉,从符号,是否Person.age相当于国内喜欢的东西return current_year - self.birth_date或干脆return self.age,其中self.age已被定义为一个常量属性。这对我来说很有意义。但是,他继续声称以下内容: 将设计类的标准客户端文档(称为类的简称),以免透露给定功能是属性还是函数(在可能的情况下)。 即,他声称即使是该类的文档也应避免指定“ getter”是否执行任何计算。 这,我不明白。难道文档不是将这种区别告知用户的重要场所吗?如果我要设计一个包含Person对象的数据库,那么知道是否Person.age是一个昂贵的调用就不重要了,那么我可以决定是否为其实现某种缓存?我是否误解了他的意思,还是他只是OOP设计哲学的一个极端例子?


5
通过对象本身的方法还是通过另一个类保存对象?
如果要保存和检索对象,是否应该创建另一个类来处理该对象,还是最好在该类本身中进行处理?还是混合两者? 根据OOD范式推荐哪个? 例如 Class Student { public string Name {set; get;} .... public bool Save() { SqlConnection con = ... // Save the class in the db } public bool Retrieve() { // search the db for the student and fill the attributes } public List<Student> RetrieveAllStudents() { // this …

5
密码或对象?
在提供用于获取域实体的业务逻辑方法时,该参数应接受对象还是ID?例如,我们应该这样做: public Foo GetItem(int id) {} 或这个: public Foo GetItem(Foo foo) {} 我相信整个传递对象,但是在这种情况下,我们得到一个对象,而我们只知道ID,该怎么办?调用方应该创建一个空的Foo并设置ID,还是应该将ID传递给方法?由于传入的Foo除了ID以外都是空的,因此我看不到调用方必须创建Foo并设置ID的好处,因为它可以将ID发送给GetItem()方法。

5
在C ++中使用名称空间的最佳做法
几个月前,我读过Bob叔叔的Clean Code,它对我编写代码的方式产生了深远的影响。即使看起来他在重复每个程序员都应该知道的事情,将它们放在一起并付诸实践确实可以使代码更简洁。特别是,我发现将大型函数分解为许多微型函数,并将大型类分解为许多微型类非常有用。 现在问这个问题。本书的示例全部使用Java,而过去几年我一直在使用C ++。干净代码中的想法如何扩展到Java中不存在的名称空间的使用?(是的,我知道Java程序包,但是并不是完全一样。) 将创建许多微小实体(每个都有明确定义的责任)的想法应用于命名空间是否有意义?一小组相关类是否应该始终包装在命名空间中?这是管理拥有许多小类的复杂性的方法,还是管理大量名称空间的成本过高? 编辑:在有关包装原则的Wikipedia条目中回答了我的问题。
38 design  c++  namespace 

17
软件设计:快速构建还是良好构建?
在构建非平凡的应用程序时,最好集中精力使事情快速运行,并在代码中采取一些捷径,例如将模型逻辑与视图混合,破坏封装-典型的代码味道?或者,您是不是最好花些时间来构建更多的体系结构,正确构建它,但是冒着这样的风险,因为您的设计非常流畅,所以可能无法使用所有这些额外的代码,并且如果反馈导致您可能不得不将其丢弃去一个不同的方向? 对于上下文,我正在构建一个桌面应用程序。我是唯一的开发人员,因为我有一份日常工作,所以我做兼职。现在,在工作中,我会尽量按计划安排正确的方式做事。但是对于这个项目,我希望它会随着人们的反馈而变化,我不确定这是正确的方法。我本周花了几个小时在适当的地方放置了教科书“模型视图控制器”设计,以将模型中的更改传达给视图。总的来说,这很好,但是我不确定是否需要多个视图来显示数据,而且我知道如果没有其他体系结构,我可以更快地显示内容。我可能每周花10到15个小时花在该项目上,如果遵循良好的软件实践,我会花很多时间来构建可以演示的东西。我知道我的用户会 不在乎我在内部使用MVC,他们只是想要解决问题的方法。但是我也遇到过这样的情况,即您因快捷方式而承担了太多的技术债务,以至于很难维护代码并添加新功能。我很想听听其他人如何解决这种问题。

19
过度使用或滥用的编程技术
您是否发现编程中有任何过度使用(IE过度使用的技术)或滥用技术,或者对所有事物都使用了一点技术,而又不能很好地解决人们试图解决的许多问题解决它。 它可以是正则表达式,某种设计模式或算法,也可以是完全不同的东西。也许您认为人们滥用多重继承等。
38 design 

9
如何在团队中应对不同的开发风格(自上而下与自下而上)?
假设您刚开始在一个非常小的团队中从事{目前相对较小,但希望以后会更大}的项目。请注意,这是一个旨在供现实世界中的其他开发人员使用的实际项目,而不是一些打算在学期末取消的学术项目。 但是,该代码尚未发布给其他人,因此尚未确定任何决定。 方法论 你们中的一个喜欢在开始编写代码并使各部分组合在一起之前,必须对所有组件的交互方式(自下而上的设计)有个清晰的认识。你们中的另一个人喜欢先进行整个设计,然后在编码解决方案之前确定所有组件和通信的细节。 假设您正在开发一个新系统,而不是模仿现有系统,因此,正确的最终设计应该是什么样子并不总是显而易见的。因此,在您的团队中,不同的团队成员有时甚至对最终产品所需的要求有不同的想法,更不用说如何进行设计了。 当自下而上的开发人员编写一些代码时,尽管该代码可能会解决手头的问题,但自上而下的开发人员还是会因为设计中可能会遇到的未来问题而拒绝该代码,并认为正确设计更重要在尝试编写解决方案的代码之前。 当自上而下的开发人员在开始编写代码之前尝试设计出完整的设计和设想的问题时,自下而上的开发人员会拒绝它,因为自下而上的开发人员并不认为实际上会出现某些问题,并认为,当要求和约束变得更加清晰时,将来可能需要更改设计。 问题 这导致的问题是自下而上的开发人员最终浪费了时间,因为自上而下的开发人员经常由于设计缺陷而决定废弃自下而上的开发人员编写的解决方案,从而需要重新设计。 -编写代码。 自上而下的开发人员最终浪费了时间,因为自上而下的开发人员现在经常坐下来与自下而上的开发人员一起制定正确的设计,将两者序列化到甚至更快的程度比2人多做1人。 两位开发人员都希望继续合作,但似乎合并实际上并没有帮助他们中的任何一个。 目标 显然,共同的目标是最大程度地提高编码效率(即,将时间浪费最小化)并编写有用的软件。 问题 简而言之,您如何解决这个问题并应对这种情况? 我能想到的唯一有效的解决方案不会浪费时间,就是让每个开发人员都遵循自己的设计风格。但是,这比您进行代码审查并实际上需要批准彼此的更改以及尝试设计一个供他人使用的一致框架时听起来的困难。 有没有更好的办法?

9
在编写面向对象的代码时,我是否应该始终遵循设计模式?
任何面向对象的程序都有可想像的设计模式吗?我之所以这么问,是因为最近我看到了带有的Door类的实现Lock。这是测试的一部分,回答说代码遵循Null Object模式: class Lock { public: virtual void close() = 0; virtual void open() = 0; virtual bool is_open() const = 0; virtual ~Lock() { } }; class DummyLock : public Lock { private: DummyLock(); DummyLock(const DummyLock&) = delete; DummyLock& operator=(const DummyLock&) = delete; private: void close() { } void …

5
当您面对从未完成的编程任务时该怎么办?
3个月前,我以.NET开发人员的身份开始了我的职业生涯,在针对各种技术,模式和概念进行了长期培训之后,负责监督我的开发人员决定我准备加入该公司处理的众多项目之一。 我很高兴终于能够开始编码。我加入的团队目前很小,因为正在开始一个新项目,这很棒,因为我参与了该项目的整个生命周期。它是一个基于Web的SPA项目,其支持使用ASP.NET MVC / ASP.NET Web API,并且在前端提供Durandal框架和相关库。 我的问题是,在与同事开会并确定下个月的任务和估计后,我发现自己处于一个不知道自己是否有能力承担任何任务的职位。 我从未完成任何已创建的任务,而且我不知道该如何进行。 例如,创建的任务之一就是为整个应用程序创建通用的错误处理机制。 当面对他从未完成的任务时,通常如何进行?

11
并发性:如何处理设计和调试实现?
我已经开发并发系统已有好几年了,尽管我缺乏正规的培训(即没有学位),但我对这个主题掌握得很好。最近至少有一些新的语言变得流行起来,这些语言至少是为了简化并发而设计的,例如Erlang和Go。似乎他们的并发方法呼应了我自己的经验,即如何使系统具有可伸缩性并利用多个内核/处理器/机器。 但是,我发现很少有工具可以帮助您可视化您打算做什么,并可以验证您至少与最初的设想接近。使用非专为并发设计的语言(例如C / C ++,C#,Java等),调试并发代码可能是一场噩梦。特别是,几乎不可能在开发环境中的一个系统上重新创建容易发生的条件。 那么,您设计系统来处理并发和并行处理的方法是什么?例子: 您如何确定可以同时进行的和必须进行顺序的? 您如何重现错误条件并查看应用程序执行时发生的情况? 您如何可视化应用程序的不同并发部分之间的交互? 对于这些问题,我有自己的答案,但我还想了解更多。 编辑 到目前为止,我们有很多不错的建议。链接到的许多文章都非常好,我已经阅读了其中的一些文章。 我在并发编程方面的个人经历使我相信与顺序编程相比,您需要不同的思维方式。精神鸿沟可能与面向对象编程和过程编程之间的差异一样大。我希望这组问题更多地集中在系统地解决问题所必需的思维过程(即理论)上。提供更具体的答案时,有助于举例说明-您亲自进行了一些研究。 赏金目标 不要告诉我该怎么办。我已经控制住了。告诉我你做什么。告诉我您如何解决这些问题。

9
为将来的更改而设计或解决眼前的问题[关闭]
在编写代码或进行设计时,您会尝试在一开始就将问题概括化,或者尝试解决非常具体的问题。 我之所以这样问,是因为试图概括问题会导致事情复杂化(可能没有必要),另一方面,如果需求发生变化,扩展特定解决方案将非常困难。 我猜解决方案是找到一条说起来容易做起来难的中间路径。您如何解决这类问题?如果您在什么时候开始对其进行泛化,您知道泛化足够了吗?
37 design 

3
REST API-API是否应返回嵌套的JSON对象?
当涉及JSON API时,将响应展平并避免嵌套JSON对象是一种好习惯吗? 例如,假设我们有一个类似于IMDb的API,但用于视频游戏。有几个实体,分别是Game,Platform,ESRBRating和GamePlatformMap,它们映射了Game和Platform。 假设您请求/ game / 1来获取ID为1的游戏,并返回嵌套了平台和esrbRating的游戏对象。 { "id": 1, "title": "Game A", "publisher": "Publisher ABC", "developer": "Developer DEF", "releaseDate": "2015-01-01", "platforms": [ {"id":1,"name":"Xbox"}, {"id":2,"name":"Playstation"} ], "esrbRating": { "id": 1, "code": "E", "name": "Everyone" } } 如果您使用的是JPA / Hibernate之类的工具,并且将其设置为FETCH.EAGER,它可能会自动为您执行此操作。 另一个选择是简单地使用API​​并添加更多端点。 在这种情况下,当请求/ game / 1时,仅返回游戏对象。 { "id": 1, "title": "Game A", …
37 design  rest  api-design  json 

6
应该避免会话变量吗?
我过去曾经严重依赖会话变量,但是最近发现其中许多不必要,而使用查询字符串参数之类的东西。 我的一位同事拒绝使用会话变量。这是一个现实的目标,并且出于任何实际原因应避免使用会话变量吗?是否可以完全避免使用会话变量(除了允许登录的会话cookie之外),这会导致更好的设计吗? 我的同事不使用它们的一些原因: 会话变量的无类型性质 会话超时导致状态丢失 会话变量的全局范围性质 负载平衡服务器丢失会话(特定于.Net?) 应用程序池/服务器重新启动 他们是不必要的

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.