软件工程

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

3
构造和命名包含具有相同名称的通用类的文件的最佳方法是什么?
在我当前的项目中,我遇到了创建具有相同名称但数量不同的泛型参数的泛型类的要求。例如: MyClass<T1> MyClass<T1, T2> MyClass<T1, T2, T3> 考虑到我希望所有这些都在同一个命名空间中,我对如何构造和命名我的类和文件感到困惑。 如果我们遵循这样的想法,即每个文件应该限制一个类,并且文件应采用表示命名空间层次结构的文件夹结构,并且文件名应与该类的名称匹配,那么我该如何处理这种情况? 什么我真的问这里是我应该怎么命名文件包含MyClass<T1>,和我应该怎么命名文件包含MyClass<T1, T2>?我没有问类型参数的名称应该是什么。
14 c#  .net 

3
我们应该在结构中添加构造函数吗?
我们经常使用c ++结构来定义数据结构,而不是使用类,类可以是带有成员方法的完整模块。从现在开始,我们知道它们都是相同的(松散地说)。 我们经常使用/处理结构作为仅数据实体的事实产生了这样的冲动,即我们也不要添加默认构造函数。但是构造函数总是很棒的,它们使事情变得更简单并有助于消除错误。 如果将默认构造函数添加到我的数据结构,会不会感到烦恼? 如果满足其他条件,实现默认构造函数还会使结构Non-POD(普通旧数据类型)吗? 为了正确理解,考虑一个简单的示例,但实际上结构会大得多。 struct method { char name[32]; float temperature; int duration; }; 每次我创建一个方法时,我都会担心(至少可以说)是否忘记设置一些值。想象一下,我忘记设置temperature该方法并将其应用于系统,该系统现在是一个随机的高值,并且会导致混乱。或者我忘了设置duration,现在该方法将其自身应用到未知的高持续时间。 为什么我应该负责每次都初始化对象,而不是执行保证它的构造函数?

3
将属于同一总体项目的多个Git存储库分组
假设我有一个包含多个组件的项目:服务器组件,Web应用程序组件,iOS组件,Android组件等。这些组件都是单独的代码库,但也松散耦合(例如,对服务器的更改)代码也可能需要更改所有其他组件) 在Git中组织此项目的最有效方法是什么?如果将所有内容放在一个存储库中,则始终会拥有最新版本,但是当您开始更改一个组件而不是其他组件时,事情变得很混乱。 另一方面,如果将每个组件都作为一个单独的存储库,则如何“链接”这些存储库,以使您知道该应用程序的2.0版要求服务器组件的1.5版等? 除了保持最新的自述文件(或者我看不到的更好的解决方案)之外,git中是否还有功能可以更有效地管理多个相关的存储库?
14 git 

2
类型理论中的正确术语:类型,类型构造函数,种类/排序和值
在回答前一个问题时,围绕特定结构的正确术语展开了一场小型辩论。由于我没有找到一个清楚地解决这个问题的问题(除了this或that,那不是很正确的事情),因此我正在提出一个新的问题。 可疑的术语及其关系是:类型,类型构造函数,类型参数,种类或种类以及值。 我还检查了维基百科上的类型理论,但这也没有太多说明。 因此,为了获得良好的参考答案并检查我自己的理解: 这些东西如何正确定义? 这些东西之间有什么区别? 它们如何相互关联?

5
需要运行24/7的程序中的异常处理
我已经读到我们应该只捕获可以处理的异常,这使得捕获基本异常类(在这种情况下为C#)不是一个好主意(除其他原因之外)。我目前是一个项目的一部分,到目前为止,除了捕获到的基本异常之外,我什么都没有看到。我提到这样做是不明智的做法,但是响应是“此服务需要24/7运行,因此是这样。” 由于我对如何正确处理需要24/7运行的程序中的异常没有很好的反应,所以我现在在这里。我没有找到有关如何处理需要全天候运行的“关键”程序/服务中的异常处理的任何信息/建议(在这种情况下,我认为如果该服务关闭一分钟可能会没事的或两个,所以甚至都不重要)。我了解这取决于程序的确切性质。与在线游戏的日志扫描器相比,可能导致生命危险的程序的要求有很大不同。 两个例子: 1:为英国铁路客户提供的提前输入服务,当他们在线搜索火车站时使用。 2:一个程序,该程序基于从轨道,火车等中的各种传感器提供的实时信息,自动控制上述铁路的铁路开关。 如果第一个程序崩溃了一到两分钟,它可能不会引起重大问题,而后者可能会导致人员伤亡。关于如何处理每个建议?指向哪里可以找到有关此问题的更多信息和想法?

6
扩展和拆分构建Web应用程序的敏捷团队的最佳方法是什么?
我最近加入了一家公司,在该公司担任Scrum主管,从事构建Web应用程序的敏捷开发项目。 该团队即将成为敏捷团队的最大规模(预计下周为9人)。我们已经讨论过将团队分成两个团队的潜在问题,不是为了缩短站立时间(目前还不过分),而是为了防止人们在sprint计划会议中完全感到无聊(这又不会太长)。 该项目有两个截然不同的层-高技术后端开发人员(例如非常复杂的开发人员)和UI设计/构建/集成。看来,当后端人员正在讨论技术时,UI人员会划分区域,反之亦然。如果只是为了提高时间效率,将团队拆分似乎是合乎逻辑的方法,但是我有一个很大的保留意见,就是我可能真正要做的就是减少协作和知识共享。这两个团队对团队其余成员的构建并没有真正的好主意。 有没有人有处理这样的事情的经验?


2
递归函数调用中返回语句的原因
我只是有一个疑问。以下子例程(例如,在列表中搜索元素)的末尾具有return语句: list *search_list(list *l, item_type x) { if (l == NULL) return(NULL); if (l->item == x) return(l); else return( search_list(l->next, x) ); } 我无法在最后获得return语句的意义(即return search_list(l-> next,x))。如果有人可以使用堆栈模型来解释这个概念,那将非常有帮助。

2
面向对象与基于矢量的编程
我陷入了面向对象和基于矢量的设计之间。我喜欢对象赋予整个建筑的能力,结构和安全性。但是同时,速度对我来说非常重要,并且在数组中具有简单的float变量确实对基于矢量的语言/库(例如Matlab或Python中的numpy)有所帮助。 这是我写来说明我的观点的一段代码 问题:添加拖车波动率数字。如果x和y是两个波动率数字,则波动率的总和为(x ^ 2 + y ^ 2)^ 0.5(假设有一定的数学条件,但在这里并不重要)。 我想非常快地执行此操作,同时我需要确保人们不要以错误的方式(x + y)添加波动率。两者都很重要。 基于面向对象的设计将是这样的: from datetime import datetime from pandas import * class Volatility: def __init__(self,value): self.value = value def __str__(self): return "Volatility: "+ str(self.value) def __add__(self,other): return Volatility(pow(self.value*self.value + other.value*other.value, 0.5)) (此外:对于那些不熟悉Python的人来说,__add__它只是一个覆盖+运算符的函数) 假设我添加了两个波动率列表 n = 1000000 vs1 = Series(map(lambda …

2
鲍伯叔叔的“名词短语名称”是什么意思?
我正在阅读Bob叔叔的Clean Code。由于我不是讲英语的人,因此我无法理解以下陈述: 类和对象应该有像名词或名词短语的名称 Customer,WikiPage,Account,和AddressParser。避免的话想 Manager,Processor,Data,或Info在类的名称。类名不能是动词。 据我所知,没有一个Manager,Processor,Data和Info是一个动词,是不是?他想强调的重点是什么?

2
共享缓存-无效的最佳做法
我想知道什么是使缓存对象无效/更新的更好方法。 先决条件 具有远程Memcached服务器(用作多个应用程序的缓存) 所有服务器均由azure托管(关联区域,相同的数据中心) 缓存对象的大小范围从200字节到50 KB 方法1(尽快存储在缓存中) 创建对象A->存储在数据库中并存储在缓存中 客户端请求的对象A->检查缓存是否存在,否则从数据库中获取并存储在缓存中 对象A更新->存储在数据库中,存储在缓存中 方法1似乎更简单。如果创建了某些内容,请尽快放入缓存。不管有人会需要它。 方法2(惰性缓存存储) 创建对象A->存储在数据库中 客户端请求的对象A->检查缓存是否存在,否则从数据库中获取并存储在缓存中 对象A更新->存储在数据库中,删除键在缓存中 方法2似乎更了解内存。在这种方法中,只有请求的项目才进入缓存。 问题1:考虑到性能,哪种方法更好?内存和CPU都不算在内。 问题2:我的想法是过早的优化吗? 问题3:还有其他想法吗?其他方法?

6
用图作为注释注释源代码
我编写了许多(主要是c ++和javascript)代码,涉及计算几何和图形以及此类主题,因此我发现视觉图表已成为解决问题过程中不可或缺的一部分。 我现在已经确定,“哦,如果我能以某种方式将手绘图附加到一段代码上作为注释,那岂不是太棒了”,这将使我回到自己从事的工作上,数天,数周,数月之前,并且可以更快地重新获得我的算法。 作为一个视觉学习者,我觉得这几乎可以通过每种类型的编程来提高生产率,因为简单的图表可以帮助您理解和推理任何类型的非平凡数据结构。例如图表。在大学的图形理论课上,我只能真正理解我可以实际绘制的图形表示形式的图形关系。 所以... 据我所知,没有IDE可让您将图片保存为代码注释。 我的想法是,我或其他人可以提出一些合理易用的工具,该工具可以将图像转换为base64二进制字符串,然后将其插入代码中。 如果转换/插入过程可以简化,这将使图表与实际代码之间的连接更好,因此,我不再需要按时间顺序搜索笔记本。更棒的是:IDE的插件可以自动解析并显示图像。从理论的角度来看,这绝对没有困难。 我的猜测是,我将需要花费一些额外的时间才能真正弄清楚如何扩展我最喜欢的IDE并维护这些插件,因此,我对一种可以进行相同解析和解析的代码后处理器感到非常满意。渲染图像并在浏览器或其他内容中与代码并排显示。由于我是一名JavaScript程序员。 人们怎么看?有人愿意为此付费吗?我会。但是我也许还会指出,无论我本人还是同龄人中的很多人愿意为这种事情付出代价,这种事情可能成功的唯一途径就是通过开源发行。

3
在MVC中,应从Controller或Model调用DAO
我已经看到了很多反对直接从Controller类调用DAO以及从Model类调用DAO的争论。事实上,我个人觉得如果我们遵循MVC模式,则控制器不应与DAO耦合,而应与Model类耦合应该从内部调用DAO,而控制器应该调用模型类。为什么,我们可以将模型类与Web应用程序分离开来,并公开各种功能,例如REST服务使用我们的模型类。 如果我们在控制器中编写DAO调用,REST服务将无法重用功能,对吗?我总结了以下两种方法。 方法1 public class CustomerController extends HttpServlet { proctected void doPost(....) { Customer customer = new Customer("xxxxx","23",1); new CustomerDAO().save(customer); } } 方法#2 public class CustomerController extends HttpServlet { proctected void doPost(....) { Customer customer = new Customer("xxxxx","23",1); customer.save(customer); } } public class Customer { ........... private void save(Customer customer){ …

11
KISS原理适用于编程语言设计吗?
KISS(“保持简单,愚蠢”或“保持简单,愚蠢”,请参见此处)是软件开发中的重要原则,尽管它显然起源于工程学。引用维基百科文章: 约翰逊(Johnson)为一组设计工程师提供了少量工具的故事就很好地说明了这一原理,而挑战是他们所设计的喷气飞机必须由普通机械师在战场上只能使用这些工具在战场上修理。因此,“愚蠢”是指事物的破坏方式与可用于解决问题的复杂程度之间的关系。 如果我想将此应用到软件开发领域,我将用“软件”替换“喷气飞机”,用“普通开发者”替换“普通技工”,用“在预期的软件开发/维护下”将“处于战斗状态”替换为“普通飞机”条件”(截止日期,时间限制,会议/中断,可用工具等)。 因此,一个普遍的想法是,应尝试使一个软件保持简单(如果省略逗号,则应保持简单愚蠢),以便以后可以轻松地对其进行操作。 但是,KISS原则也可以应用于编程语言设计吗?您是否知道专门为此原则设计的任何编程语言,即“允许普通程序员在正常工作条件下以最少的认知工作编写和维护尽可能多的代码”? 如果您引用任何特定的语言,那么可以添加指向某个文档的链接,该链接可以由语言设计者清楚地表达出来,那将是很好的选择。无论如何,我将有兴趣了解设计师的(记录的)意图,而不是您对特定编程语言的个人见解。

4
什么时候不使用Spring实例化bean?
我试图了解什么是Spring的正确用法。不是语法,而是目的。如果使用Spring,那么Spring代码是否应该替换所有bean实例化代码?什么时候使用或何时不使用Spring来实例化bean? 可能以下代码示例将帮助您理解我的困境: List<ClassA> caList = new ArrayList<ClassA>(); for (String name : nameList) { ClassA ca = new ClassA(); ca.setName(name); caList.add(ca); } 如果我配置Spring,它将变为: List<ClassA> caList = new ArrayList<ClassA>(); for (String name : nameList) { ClassA ca = (ClassA)SomeContext.getBean(BeanLookupConstants.CLASS_A); ca.setName(name); caList.add(ca); } 我个人认为在这里使用Spring是不必要的开销,因为 该代码更易于阅读/理解。 这并不是真正的依赖注入的好地方,因为我不希望会有的/可变的实现ClassA,我希望以后可以自由使用Spring配置进行替换。 我认为正确吗?如果没有,那我要去哪里错了?
14 java  spring 

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.