软件工程

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


2
从Websocket客户端发送时是否真的需要屏蔽
当前的Websocket RFC要求Websocket 客户端在发送时屏蔽帧内的所有数据(但不需要服务器)。以此方式设计协议的原因是为了防止客户端和服务器之间的恶意服务(代理等)更改帧数据。但是,此类服务仍然知道屏蔽密钥(在每个帧的开头按帧发送) 我是否以为这样的服务仍然可以使用该密钥来取消遮罩,更改内容,然后在将帧传递到下一个点之前重新遮罩内容呢?如果我没看错,这将如何修复假定的漏洞?

1
“ C ++模板:完整指南”(c)2002 —是C ++ 11的最新版本?
《C ++模板:完整指南》(c)2002 这本书对我来说似乎很有吸引力,但是由于它已经12岁了,我担心它可能已经过时了。一年前,有一些非常受好评的Amazon评论,而C ++模板上没有其他最新的标题。有谁知道2002年出版的关于模板的书(而不是专门关于STL的书)是否具有被C ++ 11取代或添加的语法或概念? 以下是来自Amazon的书籍描述: 模板是C ++最强大的功能之一,但是它们常常被忽视,误解和滥用。C ++模板:《完整指南》使软件架构师和工程师清楚了解为什么,何时以及如何使用模板来更高效地构建和维护更清洁,更快,更智能的软件。 C ++模板从关于基础概念和语言功能的有见地的教程开始。本书的其余部分可作为全面参考,首先关注语言细节,然后关注多种编码技术,最后关注模板的高级应用程序。本书中使用的示例说明了抽象概念并演示了最佳实践。 读者学习 模板的确切行为 如何避免与模板相关的陷阱 从基本到以前未记录的成语和技术 如何在不威胁性能或安全的情况下重用源代码 如何提高C ++程序的效率 如何生产更灵活和可维护的软件
10 c++  templates 

2
首选数据库规范化还是架构透明性?
新的要求出现在旧的代码库上,该代码库基本上实现了两个以前不直接相关的用户类之间的直接(内部)通信(存储在具有完全不同模式的不同表中,并且可悲的是,该代码几乎不面向对象)设计较少,因此没有父类)。由于我们不愿使用这种从未考虑过此功能的旧设置,因此无法保证不存在PK冲突-在使用数据集的情况下,实际上可以保证存在ARE。 因此,解决方案似乎很明显:用火杀死它并重写整个混乱的 A映射表。我已经为实现地图的可能方法提供了两个指导,但是我不是DBA,所以我不确定是否有我遗漏的利弊。 为了阐明抽象,请考虑三组不同的用户数据:教授,行政管理和学生(不,这不是一项家庭作业。应许!) 映射1 (professor_id,admin_id和student_id是它们各自表的外键) | mailing_id (KEY) | professor_id | admin_id | student_id | ------------------------------------------------------- | 1001 | NULL | 87 | NULL | | 1002 | 123 | NULL | NULL | | 1003 | NULL | NULL | 123 | 这种方法的+/-在缺点上非常繁重: 每行两个“浪费”字段 违反2NF 容易插入/更新异常(例如,只有0-1字段设置为NULL的行) 但是,专业人士并非没有自己的优点: 可以通过一次查找完成映射 …

5
纯功能的解决方案能否像当务之急一样干净?
我在Python中有一个练习,如下所示: 多项式作为系数的元组给出,因此幂由索引确定,例如:(9,7,5)表示9 + 7 * x + 5 * x ^ 2 编写一个函数以计算给定x的值 由于我最近从事函数式编程,所以我写了 def evaluate1(poly, x): coeff = 0 power = 1 return reduce(lambda accu,pair : accu + pair[coeff] * x**pair[power], map(lambda x,y:(x,y), poly, range(len(poly))), 0) 我认为这不可读,所以我写了 def evaluate2(poly, x): power = 0 result = 1 return reduce(lambda accu,coeff …

4
在Java中分割定界字符串的最快方法
我正在构建一个在分隔字符串上提供多列排序功能的比较器。我目前使用String类的split方法作为将原始String拆分为标记的首选。 这是将原始String转换为String数组的最佳方法吗?我将对数百万行进行排序,因此我认为方法很重要。 它似乎运行良好并且非常简单,但是不确定Java中是否有更快的方法。 这是我的比较器中排序方式的工作方式: public int compare(String a, String b) { String[] aValues = a.split(_delimiter, _columnComparators.length); String[] bValues = b.split(_delimiter, _columnComparators.length); int result = 0; for( int index : _sortColumnIndices ) { result = _columnComparators[index].compare(aValues[index], bValues[index]); if(result != 0){ break; } } return result; } 在对各种方法进行基准测试之后,不管您信不信,使用最新版本的Java最快的方法是split方法。您可以在这里下载我完成的比较器:https : //sourceforge.net/projects/multicolumnrowcomparator/

1
在Subversion中使用Git Flow的障碍
我的工作团队正在使用Subversion作为我们的VCS来启动一个新项目(出于这个问题的考虑,您可以将其视为一成不变的)。我们仍处于该项目的早期阶段,并试图就分支模型达成共识。我们之前的项目基于非标准版本模型,该模型导致管理现有版本的修补程序和修补程序时出现问题。 我发现不同的分支模型相当复杂,但是我确实很清楚地理解的一种模型是git flow。我很好奇在Subversion中实现这种变化会有多么困难/不期望。显然,在分支机构上进行协作的人会有所不同。功能分支必须集中而不是局限于本地存储库,但是据我所知,该模型的其他概念应该可以在Subversion中重现。 这种方法的缺点或挑战是什么?我听说相对于Git,在SVN中“合并成本很高”。但是我尚不清楚这在实践中意味着什么,或者它将如何影响我们使用像分支模型这样的git flow的能力。 这种方法最大的担忧是什么。有没有一种类似的清晰方法在Subversion中更自然?
10 svn  branching  gitflow 

4
fold中的函数参数的名称是什么
在高阶函数中,fold / reduce函数参数的名称(如果有)是什么? 我正在研究一个Monadic表格处理库,其中的行被折叠以产生简单的分析(例如查找列的最小,最大,平均值)。因此,我正在为fold函数的参数寻找一个合理的名称,并且在ML社区(或Haskell或Common Lisp作为第二和第三候选人)中公认的任何名称都将很有趣。 类似的名称f在fold功能描述中很常见,但是它没有描述性,名词更适合。

2
单元测试副作用繁重的代码
我开始写C ++代码来运行机器人,如果可以的话,我不知道如何合并单元测试。我提供了一个库,该库允许为机器人创建“命令”,这些命令会自动调度和执行。创建这些命令的机制是继承一个命令基类它们提供,并执行虚拟void Initialize(),void Execute()和void End()方法。这些功能纯粹是出于其副作用而运行,这些副作用会对机器人产生影响(运行电动机,伸出活塞等)。因此,除了模拟整个库之外,我几乎看不到任何将单元测试附加到代码的地方,这样我就可以检查机器人的虚拟前后状态。有没有一种方法可以对此进行单元测试,而不会造成太大的负担? 编辑 我想我可能对库的功能产生了误导。该库提供了机器人以及命令/调度系统的大部分接口,因此它不像模拟命令基类那么简单,我必须模拟整个硬件接口。不幸的是,我没有时间这样做。

4
哪种设计模式更适合记录?
我应该在程序中记录一些事件,但据我所知,最好将记录代码保留在程序之外,因为这与程序的实际功能无关。因此,您能否告诉我是否应该完全将其保留在代码之外,而仅使用观察者和侦听器记录事件?或者,我可以在需要记录某些内容的地方添加如下代码: MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99)); 使用观察者设计模式是否会出错?我需要其他设计模式吗?还是我应该停止考虑设计模式? PS1。如果我只想使用侦听器和观察者进行登录,则肯定需要添加和改进程序的观察者和侦听器。 PS2。我当然知道有许多用于登录Java的库,并且我正在使用java.utils.logging,但是我需要有一个包装器来记录我的特殊对象。

3
实体框架实体-来自Web服务的一些数据-最佳体系结构?
当前,我们在多个Web应用程序中使用Entity Framework作为ORM,并且到目前为止,由于我们的所有数据都存储在单个数据库中,因此它非常适合我们。我们正在使用存储库模式,并具有使用它们的服务(域层),并将EF实体直接返回到ASP.NET MVC控制器。 但是,提出了使用第三方API(通过Web服务)的要求,这将为我们提供与数据库中与用户相关的额外信息。在我们的本地用户数据库中,我们将存储一个外部ID,我们可以将其提供给API以获取其他信息。有很多可用的信息,但是为了简单起见,其中之一与用户的公司有关(名称,经理,房间,职务,位置等)。此信息将在整个Web应用程序的各个位置使用-而不是在单个位置使用。 所以我的问题是,填充和访问此信息的最佳位置是哪里?由于它已在各个地方使用,因此无论我们在Web应用程序中使用的何处,都临时地获取它并不明智,因此从域层返回这些附加数据是有意义的。 我最初的想法只是创建一个包含EF实体(EFUser)的包装模型类,以及一个包含新信息的新'ApiUser'类-当我们获取用户时,我们获取EFUser,然后获取其他来自API的信息,并填充ApiUser对象。但是,虽然这对于获得单个用户来说是不错的选择,但在获得多个用户时却会失败。获取用户列表时,我们无法点击API。 我的第二个想法只是向EFUser实体添加一个单例方法,该实体返回ApiUser,并在需要时填充它。这解决了上述问题,因为我们仅在需要时才访问它。 或最终的想法是将数据的本地副本保留在我们的数据库中,并在用户登录时将其与API同步。这是最小的工作,因为这只是一个同步过程-而且我们没有点击的开销每当我们想要获取用户信息时,数据库和API。但是,这意味着将数据存储在两个位置,也意味着该数据对于已经一段时间没有登录的任何用户而言都是过时的。 是否有人对如何最好地处理这种情况有任何建议或建议?


1
面向单个开发人员的极限编程[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 在过去的两周中,我一直在研究一些基本的极限编程概念,用于小型,营利,多人,街机游戏。我花了一个星期来开发用户故事并确定创建发布计划的要求。我还花了一周的时间编码并应用我想出的第一个迭代计划。我已经确定了一些对于单个开发人员有用的概念。 持续集成 永远不要尽早添加功能 测试驱动开发 选择一个系统隐喻 使用单个集成点 测试所有错误 不断重构 设定可持续的步伐 简单 频繁发布 我很好奇我是否缺少特别适合与单个开发人员项目一起工作的任何东西? 同样,鉴于这种简单性和测试驱动开发的思想,使用建立的,功能丰富的,现成的平台更好吗? 还是应该在可行的情况下从头开始工作,以避免遇到规则不断提出的问题,例如不断进行重构并且永远不要尽早添加功能?

2
当我们将计算与副作用分开时,我们将“询问世界”的代码放在哪里?
根据命令查询分离原则,以及使用Clojure演示的“ 数据中的思考”和“ DDD”,应将副作用(修改世界)与计算和决策分开,以便更容易理解和测试这两个部分。 这就留下了一个悬而未决的问题:我们应该把“问世界”放在边界的哪个位置?一方面,从外部系统(例如数据库,扩展服务的API等)请求数据不是参照透明的,因此不应与纯计算和决策代码放在一起。另一方面,将它们从计算部分中分离出来并作为参数传递是有问题的,甚至是不可能的,因为因为我们可能事先不知道可能需要请求哪些数据。

4
在Java中实现多个通用接口
我需要一个接口来确保我可以使用某种方法,包括特定的签名。到目前为止,他就是我所拥有的: public interface Mappable<M> { M mapTo(M mappableEntity); } 当一个类应该可映射到多个其他实体时,就会出现问题。理想的情况是这样(不是java): public class Something implements Mappable<A>, Mappable<B> { public A mapTo(A someObject) {...} public B mapTo(B someOtherObject) {...} } 什么是最好的方式来实现这种剩余的“通用”?
10 java  generics 

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.