软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

3
大量参数的构造函数与构造器模式
众所周知,如果您的类的构造函数带有许多参数,例如超过4个,则很可能是代码气味。您需要重新考虑该类是否满足SRP要求。 但是,如果我们构建并反对依赖10个或更多参数的对象,并最终通过Builder模式设置所有这些参数,该怎么办?想象一下,您Person用其个人信息,工作信息,朋友信息,兴趣信息,教育信息等构建了一个类型对象。这已经很好了,但是您可以通过多个4来设置相同的参数,对吗?为什么这两种情况不一样?

2
为什么包和模块是Java 9中的独立概念?
Java 9除了软件包外还将具有模块。通常,语言有其中一种。大多数程序员将两个术语视为同义词。模块建立在包的顶部,将它们视为原语。复合模式建议对原始体和复合体进行统一处理。否则会发生不好的事情。例如,看一下Valhalla项目,他们尝试在其中尝试为基元(值)和引用类型改造通用超类型。 模块和包代表语义上独立的概念吗?这意味着对于任何一种语言都应同时使用(关注点分离)。还是Java必须兼具两者才能向后兼容? 为什么要引入新概念而不是增加现有概念? JSR 376:在Jigsaw项目中实现的“ Java平台模块系统” 。 根据SOTMS 模块是一个命名的,自描述的代码和数据集合。它的代码被组织为一组包含类型(即Java类和接口)的软件包。其数据包括资源和其他种类的静态信息。 JLS小心地避免定义什么是包。来自维基百科: Java软件包是一种将Java类组织到类似于Modula模块的名称空间中的技术,以Java提供模块化编程。 我知道引用Wikipedia是一种不好的做法,但它反映了大家的共识。从模块化编程入门: 有时使用术语包而不是模块(如Dart,Go或Java)。在其他实施方式中,这是一个独特的概念。在Python中,程序包是模块的集合,而在即将到来的Java 9中,计划引入新的模块概念(具有增强的访问控制的程序包的集合)。

3
什么是去耦?它适用于哪些发展领域?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我最近注意到去耦是问题中的一个话题,并且想知道它是什么以及它可以在哪里应用。 “在哪里可以适用”,我的意思是: 它仅与涉及C和Java之类的编译语言有关吗? 我应该作为Web开发人员了解/研究它吗?

3
@staticmethod与模块级功能
这不是关于@staticmethod和@classmethod!我知道如何staticmethod工作。我想知道的是@staticmethod模块级功能的正确用例。 我已经用谷歌搜索了这个问题,似乎已经达成了一些普遍的共识,即模块级函数比静态方法更受青睐,因为它更具Python风格。静态方法具有绑定到其类的优势,如果仅该类使用它,这可能是有道理的。但是,在Python中,功能通常是按模块而非类来组织的,因此通常使它成为模块功能也是有意义的。 静态方法也可以被子类覆盖,这是一个优点或缺点,这取决于您如何看待它。尽管静态方法通常是“功能纯净的”,所以重写它可能并不明智,但有时可能很方便(尽管这可能是“便捷但绝不做”的事情之一,只有经验才能教您。) 是否有使用静态方法或模块级功能的一般经验法则?它们有哪些具体的优点或缺点(例如,将来的扩展,外部扩展,可读性)?如果可能,还提供一个案例。
21 python 



2
什么时候适合在前端进行计算?
我的团队正在开发一个基于WEB的财务应用程序,并且与一位同事存在争议,该将计算保留在哪里-纯粹在后端还是在前端? 简要说明:我们将Java(ZK,Spring)用于前端,将Progress 4gl用于后端。涉及数据库中一些核心数学和数据的计算都保存在后端,因此我不在谈论它们。我说的是用户输入值X,然后将其添加到值Y(在屏幕上显示),然后结果显示在字段Z中的情况。我的意思是,纯简单的jQuery-ish操作。 因此,这里的最佳做法是: 1)使用JavaScript添加值,该值可保存到后端和后端,然后在后端“保存时”验证它们? 2)将所有业务逻辑放在同一位置-因此将值带到后端并在那里进行计算? 3)在前端进行计算;然后将数据发送到后端,在那里进行验证,仅在结果有效且相等时才再次进行计算,然后将其显示给用户? 4)还有别的吗? 注意:我们在Java中进行了一些基本的验证,但与其他所有业务逻辑一样,大多数验证仍在后端。 通过重新计算后端中的所有内容来发送的数据增加不是问题(XML大小较小;服务器和带宽可以承受用户增加的操作量)。


2
谁先进行了异步/等待?
Python在2015年在3.5中添加了async / await构造。Javascript社区朝着它迈进了一大步,并在2017年发布的ES8草案中增加了非常相似的实现(据我了解)。Typescript在2015年的1.7版中还添加了异步方法,使未经训练的人看起来完全像js异步方法。 C#在2012年添加了异步方法,这些方法看起来与async / await的所有其他实现类似,并且基于F#的行为类似但外观不同的异步工作流,该工作流于2010年在F#2.0中引入。这是我所知道的最早关于异步编程语言的示例-具有异步/等待对的C#和具有异步流的F#。 是否有较早的示例在此上下文中将关键字用作语言构造(或库)?从我有限的信息来看,似乎每个人都模仿了C#实现的优秀部分,但是C#是否从其他人那里复制了它呢?

6
在一家小公司中进行编程/协作配对
我在一家小型开发公司工作,担任首席开发人员。我们还有另外两个开发人员,还有我的老板,他是一名开发人员,但实际上并没有做太多实际的编码。 我要克服的问题是多方面的。我们之间的趋势是所有人之间都没有太多合作就可以从事我们自己的项目。事实上,我(作为最高级的开发人员)比其他人更愿意寻求他人的意见/帮助,因为我重视外在的想法。 我想加强我们的合作,并向他们表达了这一点。在很大程度上,因为我想向他们展示一些有关如何成为更好的开发人员和遵循更好的做法的事情。但是考虑到我们其他开发人员的个性类型,我认为他们一个人工作更自在。 我一直在阅读关于结对编程的知识,并且我已经(在某些论坛中)读到,当您拥有一个开发人员比其他开发人员更先进时(我是),它不能很好地工作。但是,我觉得我们必须开始合作,以使我们的工作不会如此分散。 我的问题是,是否有人曾经遇到过类似情况,什么对他们有用? 我意识到这不是万能的,但我愿意尝试多种方法。 我们所有人都在一个公共区域工作,开发人员没有单独的办公室/隔间。


6
通过不缓存结果的方式实现LINQ有什么好处?
对于使用LINQ弄湿脚的人来说,这是一个众所周知的陷阱: public class Program { public static void Main() { IEnumerable<Record> originalCollection = GenerateRecords(new[] {"Jesse"}); var newCollection = new List<Record>(originalCollection); Console.WriteLine(ContainTheSameSingleObject(originalCollection, newCollection)); } private static IEnumerable<Record> GenerateRecords(string[] listOfNames) { return listOfNames.Select(x => new Record(Guid.NewGuid(), x)); } private static bool ContainTheSameSingleObject(IEnumerable<Record> originalCollection, List<Record> newCollection) { return originalCollection.Count() == 1 && newCollection.Count() …

3
在不填满巨大数组的情况下产生大问题的专业方法:C ++,从数组的一部分释放内存
我正在开发物理模拟,由于我对编程还不熟悉,因此在生成大型程序时会遇到很多问题(主要是内存问题)。我知道动态内存分配和删除(新建/删除等),但是我需要一种更好的方法来构造程序。 假设我正在模拟一个实验,该实验运行了几天,并且采样率非常高。我需要模拟十亿个样本,然后运行它们。 作为一个超级简化的版本,我们将说一个程序采用电压V [i],并将它们加在一起为5: 即NewV [0] = V [0] + V [1] + V [2] + V [3] + V [4] 然后NewV [1] = V [1] + V [2] + V [3] + V [4] + V [5] 然后NewV [2] = V [2] + V [3] + V [4] + …
20 c++  data  memory  array  dynamic 

4
您采取什么措施来避免在大型数据库中错误地更新数据?
在进行任何生产部署之前,通常的建议是先备份数据库。这样,如果新更新存在一些可能导致潜在数据丢失或逻辑数据损坏的问题,则您仍具有备份以比较和更正旧记录。 但是,这可以很好地工作,直到数据库大小达到几GB。一旦数据库很大,备份就需要很长时间才能完成。在这种情况下应遵循哪些最佳实践,以避免由于代码部署中的逻辑问题而导致逻辑数据损坏?

4
以函数为参数的函数是否还应该以那些函数的参数为​​参数?
我经常发现自己编写的函数看起来像这样,因为它们使我可以轻松地模拟数据访问,并且仍然提供一个接受参数的签名来确定要访问的数据。 public static string GetFormattedRate( Func<string, RateType>> getRate, string rateKey) { var rate = getRate(rateKey); var formattedRate = rate.DollarsPerMonth.ToString("C0"); return formattedRate; } 要么 public static string GetFormattedRate( Func<RateType, string> formatRate, Func<string, RateType>> getRate, string rateKey) { var rate = getRate(rateKey); var formattedRate = formatRate(rate); return formattedRate; } 然后我用它像这样: using FormatterModule; …

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.