软件工程

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

1
响应式编程和MVVM模式,用于管理GUI更新
响应式编程和MVVM是可以解决将域层与UI分离的问题的两种方法。 MVVM通过定义视图模型来实现此目的,该视图模型是映射到UI组件的数据结构。UI显示数据,并可能在用户出现时进行更新。 一个反应式框架定义了一个可观察的图形,该图形通知UI某些数据已更改 在主流平台(.net和java中的Rx,react.js)和更多实验性的地方(在Haskell中的FRP)中,反应性框架都在引起人们的关注。 我主要使用带有角度的MVVM,尽管我仅使用它从事小型/中型项目,但我发现表现力比的简单性令人满意。 反应式框架购买了mvvm不买的开发者? 真的有区别吗?例如,knockout.js被宣传为mvvm框架,但在其界面中有一种反应: this.firstName = ko.observable("John"); this.lastName = ko.observable("Smith"); this.fullName = ko.computed(function() { return this.firstName() + " " + this.lastName(); }, this);
11 gui  mvvm  ui  reactive 

3
第一方和第二方是谁?
因此,这纯属好奇。我已经听过“第三方”一词,就像在“第三方库”中一样。 我不知道为什么我们说第三而不是第二(或第四)? 第一方和第二方是谁,该术语来自哪里?

3
打印到控制台/标准输出是一种好的调试策略吗?
假设我们有一个像这样的函数: public void myStart() { for (int i = 0; i<10; i++) myFunction(i); } private int myFunction(int a) { a = foo(a); a = bar(a); return a; } private int foo(int a) { //do something here //something gnarly here //etc return aValue; } private int bar(int a) { // do …
11 debugging 

8
平衡信息异常和干净代码的好方法是什么?
使用我们的公共SDK,我们倾向于提供非常有用的消息,说明为什么发生异常。例如: if (interfaceInstance == null) { string errMsg = string.Format( "Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.", ParameterInfo.Name, ParameterInfo.ParameterType, typeof(IParameter) ); throw new InvalidOperationException(errMsg); } 但是,由于倾向于将重点放在错误消息而不是代码在做什么,这往往会使代码流变得混乱。 一位同事开始重构一些引发如下异常的异常: if (interfaceInstance == null) throw EmptyConstructor(); ... private Exception EmptyConstructor() …

1
Python随机混洗如何工作?
在Python中如何进行随机混洗? 我问,因为它工作非常快。当我尝试编写shuffle时,它对10 ^ 6元素的工作时间为1分钟,但是Python shuffle可以在8秒钟内完成吗?
11 python  random 

5
一系列操作的最佳OOP设计模式
我正在开发一个应用程序,该应用程序的模块按顺序执行以下财务操作: 当用户要求将一定金额转入她的银行帐户时: 检查现在是否可以进行任何交易?(交易只能在特定时间段内进行) 检查用户是否已要求提取最低金额 检查用户是否具有任何默认帐户 以上所有操作的结果均应记录。 如果满足以上所有条件,则执行交易。将来可能还会有其他检查。 哪种面向对象设计模式最适合上述情况?

3
在Git中使用测试分支
我们有一个人(我们叫他Ted)负责测试新功能和错误修复。 我们正在使用Git和GitHub。master应该/始终可以部署,并且development是我们提交/合并新功能或错误修复的地方,但前提是经过Ted测试之后。 该项目使用PHP。 我希望测试过程如下: 开发人员想要开发新功能(例如,问题跟踪程序中Ted记录的功能/错误#123),因此他origin/development进入development了自己的本地存储库,并issue-123从那里创建了一个新分支(比如)。 对工作感到满意后,他承诺并将其新分支推至origin。 Ted连接到test.ourproject.com/choose-branch并看到分支上的列表,origin然后选择打开issue-123(应该可以通过网页进行操作)。然后test.ourproject.com,他继续进行测试,在Web应用程序之外进行测试(他真的很无情),在与开发人员反复交流之后,他对该功能感到满意。 特德告诉他可以合并开发issue-123到development上origin。 冲洗并重复。 第三步,我可以破解一些可以完成工作的东西(显示和切换特定页面上的分支),但是我觉得我所描述的是非常普遍的模式。 所以我的问题是: 这是分支的良好/可持续/可维护的工作流程吗?您是否可以通过引用此工作流程中其他项目的一些示例来备份您的答案?

4
SaaS应用程序中的用户会话超时处理-讨论几种方法
我知道这很有可能被标记为重复,但是找不到我要找的东西 这是一个常见问题,我敢肯定它有一些定义明确的最佳实践解决方案 背景 单个页面的SaaS应用程序具有很多拖放功能,用户可以在不进行大量服务器通信的情况下与之交互 服务器会话仅使用非持久会话cookie来保存用户对象 X小时后,会话在服务器上到期 有些东西仅在登录时加载 问题 用户在应用程序上工作,完成后,用户不会注销,只是保持浏览器保持打开状态 用户超过X个小时后返回(会话在服务器上无效) 用户无需服务器连接即可与应用进行交互(拖放内容,文本编辑...) 仅在下一次服务器交互时(假设没有自动保存),用户将被抛出到登录页面,并丢失一些工作 可能的解决方案 这是我想到的一些解决方案,想听听是否还有其他解决方案,以及其中是否有任何根本性的错误。 1.永远不要注销用户 怎么样?保持长时间的会话,保持持久的cookie或javaScript“保持活动” ping 优点:用户无需担心任何事情,可以为他们解决问题 缺点:不符合PCI标准,不安全,并且需要进行开发更改,例如仅在用户登录时加载到会话的内容需要转移到pub子模型(侦听事件更改)或具有缓存超时。 2.本地存储 怎么样?如果注销,使用新的本地存储临时存储状态,重定向到登录页面,登录后永久保存 优点:也是“离线工作”支持的基础,而不仅仅是处理会话超时 缺点:难以实施,需要对数据树进行状态合并,并非所有浏览器都支持 3.自动保存 更改模型的每个用户操作都应立即保留(或通过某种客户端队列),例如,如果他们选中了复选框,更改了文本字段或拖放了某些东西,则一旦完成,就保留更改。 怎么样?使用MV **框架(Backbone.js / Knockout.js / Ember.js / Angular.js等)绑定模型,并坚持更改。 优点:似乎是一个干净的解决方案,只要用户处于活动状态,会话就处于活动状态,如果不坚持下去,则不会进行任何客户端工作。 缺点:会话超时丢失后,用户上一次执行的操作。 4.会话过期后注销用户 这可以有几种方法 询问服务器“会话已过期”-这有点像22 /薛定inger的猫,因为服务器的唯一问题是延长了会话(重新启动超时), 怎么样?要么有一个服务器支持这样的问题(我什么都不知道,但是我来自Java领域),或者可以只保留一张会话ID表,手动上一次访问时间,然后通过传递会话来询问服务器。 ID作为参数而非cookie的参数,我不确定这是否可行,但是听起来很危险,不安全且设计不佳。 优点:如果服务器中有这种本机支持,这听起来像是一个干净,合理的问题(询问用户X是否仍然有会话,如果有则不进行更新) 缺点:如果服务器不支持它(同样,我不知道是否有服务器或框架具有此功能),则解决方法可能会带来巨大的安全风险。 我听说的一种解决方法是在服务器端进行一次简短会话,并在客户端ping保持活动状态ping,最多可以ping 怎么样?服务器上的简短会话,客户端ping每个sessionTimeOut / 2,最大重试次数为Y。 优点:可以解决问题,快速又脏 缺点:感觉像黑客一样,自己处理会话续订而不是让服务器执行 客户端计时器 …

3
65535号有什么特别之处吗?
2¹⁶-1&2⁵=2⁵(或?显然吗?) 一个开发人员今天问我什么是65535和32,即2¹⁶-1和2⁵=?我起初以为是32,但似乎很容易,然后我想了几分钟,然后回答了32。32似乎是正确的答案,但是如何?65535 =2¹⁶-1= 1111111111111111(但似乎不正确,因为此二进制数全为-1(?)),32 = 100000,但我无法将其转换为头脑,因此无论如何我回答32,因为我有回答一些问题。答案32实际上是微不足道的吗?以同样的方式2¹⁶-1&2⁵-1= 31吗?开发人员为什么要问我有关65535的确切信息? 要求我评估的二进制值是1111111111111111和100000,但我不明白为什么1111111111111111不是-1。不是-1吗?65535是一个产生溢出的数字,我怎么知道?


2
有多少个使用线程?
当我在台式机/笔记本电脑上(重新)构建大型系统时,我告诉我make使用多个线程来加快编译速度,如下所示: $ make -j$[ $K * $C ] $C应该在哪里指示机器拥有的内核数量(我们可以假设它是一位数字),而根据我的心情,$K我从2到有所不同4。 因此,例如,我可能会说make -j12我是否有4个核心,这表示make要使用多达12个线程。 我的基本原理是,如果仅使用$C线程,则内核将在进程忙于从驱动器中获取数据时处于空闲状态。但是,如果我不限制线程数(即make -j),那我就有浪费时间切换上下文,耗尽内存或什至更糟的风险。假设计算机具有$M千兆内存($M大约为10)。 所以我想知道是否有一个确定的策略来选择运行效率最高的线程数。

3
混淆C ++应用程序代码重要吗?
在Java世界中,有时似乎是一个问题,但是C ++呢?有不同的解决方案吗? 我在考虑这样一个事实,即有人可以用同一库的不同版本替换特定操作系统的C ++库,但是充满了调试符号以了解我的代码的作用。使用标准库或流行库是一件好事吗? 在Windows下将某些dll库替换为该库的“调试版本”时,也会发生这种情况。首选静态编译更好吗?在商业应用程序中,我看到针对其应用程序的核心,它们静态地编译了所有内容,并且在大多数情况下,dll(通常是动态库)用于提供一些第三方技术,例如反盗版解决方案(我在许多游戏中都看到了这一点) ),GUI库(如Qt),OS库等。 静态编译是否等效于Java世界中的混淆处理?用更好的术语来说,这是保护代码的最佳,最实惠的解决方案吗?

3
什么是哈希圣经?
在哈希表和哈希表上是否有类似Cormen的参考书?由于某种原因,这种特殊的结构在我的CS教育中很少受到关注,但是我想学习更多,因为它们似乎无处不在。我知道Cormen会介绍它,但我正在寻找更专业,更深入的内容。

3
低级Linux图形
出于教育目的,我想在Linux环境下编写一个应用程序,该应用程序可以处理键盘事件并绘制图形而没有诸如X或SDL之类的巨大依赖。我认为这是必须可行的,因为X和SDL本身就是程序,因此它们必须依赖于环境固有的其他方法。这种理解正确吗? 如果是这样,我在哪里可以学习编写这样的程序?我有限的经验告诉我,这将涉及到调用内核和/或写入特殊文件。但是,我还没有找到有关此问题的任何教程(我什至不知道Google应该怎么做)。 另外,如果相关,我将在Virtualbox上运行Debian Squeeze。我使用的netinst cd没有联网功能,因此当前没有太多安装。我将安装gcc,但我希望仅此而已。
11 linux  graphics 

3
不直观的C#String.Split()实现的原因
在C#中,如果我想将a分开string,string则必须执行以下操作: testString.Split(new string[] { "anotherString" }, StringSplitOptions.None); 从过载的String.SplitMSDN文档中,我们可以看到实现以及为什么必须进行这样的调用。 来自Python,我很难正确理解为什么需要这样的调用。我的意思是我可以Regex.Split用来获得与Python实现类似的语法,但是对于任何简单的事情,我都必须以降低性能(设置时间)为代价来实现。 因此,基本上,我的问题是,为什么我们不能做这样的事情: testString.Split("anotherString"); 请注意,我不建议任何原型或实现。我了解,考虑到当前的API,为什么您无法实现上述版本。我的目标是考虑到上述语法带来的好处,为什么要创建这样的API。到目前为止,灵活性似乎已成为当前潮流的目标String.Split,但老实说,我确实认为在某种程度上可以提高性能。我想我错了。

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.