Questions tagged «programming-practices»

编程实践是软件开发中常用或不常用的实践。这些可以包括敏捷开发,看板,编码快捷方式等。

3
“高凝聚力”是什么意思?
我是一名学生,最近加入了一家软件开发公司作为实习生。回到大学时,我的一位教授曾经说过,我们必须努力实现“低耦合和高凝聚力”。 我了解低耦合的含义。这意味着将单独组件的代码分开保存,这样一处更改不会破坏另一处的代码。 但是,高凝聚力是什么意思。如果这意味着将同一组件的各个部分很好地集成在一起,我不知道这将如何变得有利。 高凝聚力是什么意思?可以解释一个例子来理解它的好处吗?


2
基于角色的REST API?
我正在构建一个REST API,具有不同角色的多个用户将可以访问它所包含的资源。 为了简化范围,让我们采用“学生/教师/班级”域: GET /students 是要访问的资源。 用户可能具有学生和/或老师之类的角色 学生将只能访问其班级的学生。老师将有机会接触所教课程的学生。一些用途可能是学生,也可能教其他课程。他们必须有权访问班级的学生和所教课程的学生。 理想情况下,我希望将其实现为两个功能-每个角色一个,如果用户具有多个角色,则“工会”。 我的问题是:我应该使用哪种模式来实现这一目标? 在外部 我应该按角色划分API吗?GET /teacher/students而GET /student/students这似乎并不合适的给我。 保留所有这些,我是一种资源(首选) 内部地 应该如何在内部实施? 每种方法都应该以BIG开关/如果每个角色开头吗? 我应该为每个角色实现一个存储库吗? 有没有一种设计模式可以帮助我实现这一目标? 附带说明一下:我正在使用ASP.NET Web API和Entity Framework 6,但这对于概念性实现来说并没有关系。

9
在临时解决方法的方法名称中包含错误编号是否被认为是不好的做法?
我的高级同事阻止我进行代码审查,因为他希望我将方法命名为“ PerformSqlClient216147Workaround”,因为这是某些缺陷的解决方法。现在,我的方法名称建议类似于PerformRightExpressionCast,它倾向于描述该方法的实际作用。他的论点是这样的:“这种方法仅在这种情况下用作解决方法,而在其他地方则没有。” 在临时解决方法的方法名称中包含错误号是否被视为不良做法?

9
单例模式的替代方案
我对单例模式有不同的看法。一些人主张应不惜一切代价避免使用它,而另一些人则认为在某些情况下它可能是有用的。 我使用单例的一种情况是当我需要一个工厂(假设类型F的对象f)来创建某个类A的对象时。工厂使用一些配置参数创建一次,然后每次使用类型A被实例化。因此,要实例化A的代码的每个部分都获取单例f并创建新实例,例如 F& f = F::instance(); boost::shared_ptr<A> a = f.createA(); 所以我的一般情况是 出于优化原因(不需要多个工厂对象)或共享公共状态(例如,工厂知道仍可以创建A的实例),我只需要一个类的实例即可 我需要一种方法可以在代码的不同位置访问F的此实例f。 我对讨论此模式的好坏不感兴趣,但是假设我想避免使用单例,我还可以使用其他什么模式? 我的想法是(1)从注册表获取工厂对象,或(2)在程序启动期间的某个时候创建​​工厂,然后将工厂作为参数传递。 在解决方案(1)中,注册表本身是一个单例,因此我刚刚将不使用单例的问题从工厂转移到了注册表。 在情况(2)中,我需要工厂对象来自的一些初始源(对象),因此恐怕我会再次落入另一个单例(提供我的工厂实例的对象)。通过跟踪此单身人士链,我可以将问题简化为一个单身人士(整个应用程序),通过它 可以直接或间接管理所有其他单身人士。 最后一种选择(使用一个初始单例创建所有其他唯一对象并将所有其他单例注入正确的位置)是否可以接受?当有人建议不要使用单例时,这是隐式建议的解决方案,还是其他解决方案,例如在上述示例中? 编辑 由于我认为我的问题的重点已经被某些人误解了,因此这里提供了更多信息。如所解释的,例如这里,词语 单可指示(a)中的一类具有单个实例对象和(b)用于创建和访问这样的对象的设计模式。 为了使事情更清楚,让我们对(a)使用术语唯一对象, 对(b)使用术语单例模式。因此,我知道单例模式和依赖项注入是什么(顺便说一句,最近我一直在大量使用DI从我正在处理的某些代码中删除单例模式的实例)。 我的观点是,除非整个对象图都是从位于main方法堆栈上的单个对象实例化的,否则始终需要通过singleton模式访问一些唯一的对象。 我的问题是,完整的对象图创建和连接是否取决于主要方法(例如,通过一些不使用模式本身的强大DI框架)是唯一的无 单例模式解决方案。

11
在某些任务中可以使用贵公司不支持的语言吗?
我在一家支持多种语言的公司工作:COBOL,VB6,C#和Java。 我在主要工作中使用这些语言,但是我经常发现自己要用Python编写一些次要程序(例如脚本),因为我发现它是完成此类任务的最佳工具。 例如:分析师给了我一个复杂的CSV文件来填充一些数据库表,因此我将使用Python对其进行解析并创建一个数据库脚本。 有什么问题? 我看到的主要问题是这些快速且肮脏的脚本中的一些部分正逐渐变得越来越重要,并且: 我的公司不支持Python 它们不受版本控制(我以其他方式对其进行备份) 我的同事不了解Python 分析人员甚至已经开始在电子邮件中引用它们(“启动导出脚本...”),因此比我最初想象的需要更多的时间。 我应该补充一点,这些脚本只是不属于主项目的实用程序;他们只是帮助在更短的时间内完成琐碎的任务。对于我自己的小任务,它们有很大帮助。 简而言之,如果我是偶然的彩票赢家,我的同事将需要在没有这些脚本的情况下保持项目的生命。例如,他们会花费更多时间手动修复CSV错误。 这是常见的情况吗?难道我做错了什么?我该怎么办?

2
圈复杂度范围[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 圈复杂度的类别是什么?例如: 1-5:易于维护 6-10:困难 11-15:非常困难 20+:接近不可能 多年以来,我一直认为10是极限。除此之外的任何事情都是不好的。我正在分析解决方案,并且正在尝试确定代码的质量。当然,圈复杂度不是唯一的衡量标准,但可以提供帮助。有些方法的圈复杂度为200+。我知道这很糟糕,但是我很想知道下限范围,就像上面的例子一样。 我发现了: 卡内基梅隆大学的上述参考值定义了圈复杂度值的四个粗略范围: 1至10之间的方法被认为简单易懂 10到20之间的值表示更复杂的代码,可能仍然可以理解;但是由于代码可能会占用更多的分支,因此测试变得更加困难 20或更高的值是具有大量潜在执行路径的典型代码,只有非常困难和努力才能完全掌握和测试 方法甚至更高,例如> 50,肯定是无法维护的 在为解决方案运行代码指标时,结果在25以下的所有项目均显示为绿色。我不同意这一点,但我希望得到其他输入。 是否有普遍接受的范围复杂性的范围列表?

2
如何编写代码文档,为什么软件(通常)文档记录不佳?
有一些很好的示例,这些示例都记录了很好的代码,例如java api。但是,公共项目(例如git和公司的内部项目)中的许多代码都没有很好的文档记录,并且不是很新手。 在我所有的软件开发工作中,我不得不处理文档记录不佳的代码。我注意到以下情况- 代码中很少或没有注释。 方法和变量名不是自描述的。 很少或没有文档说明代码如何适合系统或业务流程。 雇用不良的开发者或不指导好的开发商。他们不能编写简单干净的代码。因此,包括开发人员在内的任何人都很难或不可能编写代码。 结果,我不得不阅读大量代码并与许多人交谈以学习事物。我觉得这浪费了大家的时间。它还为项目的新手带来了KT /知识转移会话的需求。 我了解到,由于以下原因,文档没有得到应有的重视: 懒惰。 开发人员只喜欢编写代码就什么都不喜欢。 就业保障。(如果没有人能轻易理解您的代码,那么您可能就很难被替换。) 艰难的截止日期几乎没有时间记录在案。 因此,我想知道是否有一种方法可以鼓励和执行公司或项目中的良好文档规范。无论项目的复杂性如何,用于为任何项目的系统和代码创建体面文档的策略是什么?有什么很好的例子,说明什么时候需要最少的文档或根本不需要文档? 恕我直言,我认为我们应该在项目交付后对文档进行审查。如果它不简单,简洁,说明性和用户友好性,则开发人员或技术文档工程师将对此负责,并负责对其进行修复。我既不希望人们编写大量文档,也不希望它像第一本书一样对用户友好,但是我希望它消除了数小时的分析和浪费的KT会话。 有没有办法结束或减轻这种疯狂?也许是“文档驱动的开发”?

15
程序员有时会故意过分复杂化代码吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 在stackoverflow上似乎出现了很多次,人们(尤其是程序员)倾向于使问题的解决方案变得过于复杂,以至于解决方案比原始问题复杂得多?我无论如何都不是专家,但是很多时候我尝试使用最可行的最简单的解决方案(很显然这并非在任何地方都可行),但是我在建议人们认为工作上的简单解决方案方面取得了很大的成功忽略更复杂的解决方案? 对于程序员来说,这是正常的事情吗?....或者我只是在考虑正确的角度而已。

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

12
行业对热情的程序员没有地方吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我一直在我的经理认为如果您在一个地方的地方实习, 产品公司,那么您通常会花时间调整产品,有时会添加一些功能,或者 服务公司,那么您会继续做重复的事情 这让我感到行业不适合喜欢创造新闻和解决难题的人。 那么,这个行业不是一个充满激情的程序员的地方吗?这会因国家而异吗? 更新以清除某些事情,这些事情与它们的含义不同。 在这里进行调整是确保您的产品具有表,该表具有客户想要的行数和列数,等等。为客户定制它。 新的“功能”在这里不是新功能。只是美学层面的变化。有时候是。 我不确定他所说的重复是什么意思。他就像,您必须一次又一次地创建UI。(不过,我在那儿看不到任何重复。如果需要一个不同的 UI,则需要设计一个不同的 UI。如果可以使用旧的UI,则无论如何都不需要做很多事情。)

8
您如何成为const正确性转换的?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 经过15年的C ++工作,我仍然没有学会使用const。我知道它的用法,但实际上我从来没有遇到过const正确会避免我面临的问题的情况。 那么,您是如何爱上const的好处的呢?

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

7
九十九规则在实践中
代码的前90%占开发时间的前90%。其余10%的代码占了开发时间的90%。 —贝尔实验室的汤姆·卡吉尔 实际上这是什么意思?程序员需要做大量工作,他们付出了180%的努力吗?

8
在代码审查期间编写测试是否有益?
我的一个同事提出了一个我发现很有趣的想法。 假设我们不做TDD,那么由进行审核的人员在代码审阅期间编写测试是否有益? 对于这个问题,假定这是一个纯粹的学术项目,因此没有生命危险。而且该团队是4个人。每个人都知道该语言,并且熟悉所使用的所有工具/库/框架,并且可以编写测试。因此,基本上不是高级全职首席忍者工程师,而是体面的编码人员的人。 我发现的优点: 鼓励在审阅期间对代码有更深入的了解,以编写有意义的测试。 然后,您可以添加由正在测试的代码的作者进行的那些测试的代码审查。 我发现的缺点: 代码编写和测试之间的反馈循环不断增长。 编辑:我知道它不能在“正常”的Web应用程序上正常工作。我想到的是一个极端的案例,在该案例中,您需要实施复杂,科学的算法,这些算法都需要注意细节。让我们假设实现自己的图形库,NLP等。我想知道我们正在编写的代码是否与数据库隔离,并且这样很难理解却不会增加控制级别,而另一个需要了解源代码的人代码并进行有意义的测试,从而使整个过程不太容易受到那些不太明显的bug的影响,这些bug不会使应用程序崩溃,但最终会使您的结果混乱?

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.