软件工程

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


14
如何逻辑地定义“或”
最近,我遇到了一个问题,该问题要求我以编程方式定义逻辑“ OR”运算符,但不使用运算符本身。 我想到的是: OR(arg1, arg2) if arg1 = True and arg2 = True return True else if arg1 = True and arg2 = False return True else if arg1 = False and arg2 = True return True else: return False 这种逻辑是正确的,还是我错过了什么?

15
您如何有效地与开源项目竞争?
一家拥有可靠的开源项目与传统的封闭源产品竞争的公司似乎是无法击败的。 我阅读了这篇文章,其中作者列出了这种情况: 假设可以在两个产品之间划分一个软件市场(例如网络管理)。一个承担一切可能,花费100万美元,另一个承担10%的费用,但免费开放。 商业解决方案的价格标签将自动过滤掉大量用户,而这些人将不得不转向开源。但是有些用户会对10%的功能感到满意,并选择了它。 例如,我的桌上有一台原始的Macintosh计算机。它运行一个称为MacWrite的文字处理器。除了拼写检查外,它需要执行所有工作,而我需要使用文字处理程序。我可以设置段落格式,选择字体,使文本变为粗体或斜体,甚至粘贴在图片和图形中。所有操作都在“所见即所得”用户界面中。 占用磁盘空间76K。在“千字节”中就是“ K”。 将此与Microsoft Word进行比较。我认为上一次我仅安装Word时,它的大小约为30MB,比MacWrite大很多倍,但是我使用它的时间并没有比使用MacWrite多得多。像我一样,许多用户对基本功能感到满意。他们不需要所有的风吹草动。 但是回到我的比喻。最初,商业公司可能会忽略开源项目。这对他们的收入来源没有威胁,那么为什么他们要关注新贵呢? 但是,如果这个项目是健康且可持续的,那么大概在一年左右的时间内就可以完成商业产品的15%-20%。这应该使更多的用户从他们的业务中流失,也许现在他们开始关注了。 最有可能的是,这种关注将采取针对项目的营销形式。他们会认为它太小或功能不足以至于不能认真对待。从短期来看,这可能会起作用。但是,他们承认该项目的事实只会激起人们的兴趣。有些人会自己确定它既不会太小也不不会太强大,并会开始使用它。 再过一两年,现在该项目已达到商业产品功能的50%。人们开始大批加入该项目。商业公司现在必须做点什么。他们在做什么?他们添加了更多功能。 请记住,该商业产品已经满足了人们所需的100%。那么他们可以添加什么样的功能呢?不必要的。它们可能会更改用户界面的外观或在网络管理之外添加功能。无论如何,这种发展将花费金钱,并且将开始蚕食该公司的利润。 最终,随着社区的健康发展和新用户的涌入,开源项目最终将达到商业产品功能的80%-90%。在用尽了所有创收途径之后,这家商业公司仍有最后一个选择:将螺丝钉给剩余的客户。寻找向他们收取更多费用的方法,以寻求他们可以从投资中获得的收益,最终将其驱赶出客户。 牵强?我不这么认为。只有两个主要要求: 首先,找到一个市场,其中开源可以提供引人注目的替代方案,例如网络管理。 第二,围绕开源项目建立一个可持续发展的社区。 看来很合理。如果您是一家开源公司,您将如何竞争?

5
仅通过参数名称(而不是类型)来区分方法是否足够?
仅通过参数名称(而不是类型)来区分方法就足够了吗?还是更明确地命名呢? 例如T Find<T>(int id)VS T FindById<T>(int id)。 是否有充分的理由更明确地命名(即添加ById)而不是仅保留参数名称? 我能想到的一个原因是方法的签名相同但含义不同。 FindByFirstName(string name) 和 FindByLastName(string name)

3
“构成超越继承”是否违反了“枯燥原则”?
例如,考虑我有一个可供其他类扩展的类: public class LoginPage { public String userId; public String session; public boolean checkSessionValid() { } } 和一些子类: public class HomePage extends LoginPage { } public class EditInfoPage extends LoginPage { } 实际上,子类没有任何方法可以覆盖,也不会以通用方式访问HomePage,即:我不会做类似的事情: for (int i = 0; i < loginPages.length; i++) { loginPages[i].doSomething(); } 我只想重用登录页面。但是根据https://stackoverflow.com/a/53354,我在这里更喜欢合成,因为我不需要LoginLog接口,所以在这里我不使用继承: public class HomePage { …

7
强制性break语句和其他循环检查的功能等效项是什么?
假设我具有以下逻辑。如何在函数式编程中编写它? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } 大多数博客,文章中的示例……我看到的只是解释了一个简单的数学函数“ Sum”的简单例子。但是,我有一个类似于以上用Java编写的逻辑,并且希望将其迁移到Clojure中的功能代码。如果我们无法在FP中执行上述操作,则FP的促销方式不会明确说明这一点。 我知道上面的代码是绝对必要的。编写此程序并非出于将来将其迁移到FP的考虑。

5
与定义一个方法可以调用相比,如何定义一个方法可以被覆盖更强的承诺?
来自:http : //www.artima.com/lejava/articles/designprinciples4.html 埃里希·伽玛(Erich Gamma):即使十年之后,我仍然认为这是真的。继承是改变行为的一种很酷的方法。但是我们知道它很脆弱,因为子类可以轻松地对调用其重写的方法的上下文进行假设。基类和子类之间存在紧密的耦合,因为隐式上下文将在其中调用我插入的子类代码。合成具有更好的属性。通过将一些较小的东西插入较大的对象中,可以减少耦合,而较大的对象仅将较小的对象回调。从API的角度来看,定义可以覆盖的方法比定义可以调用的方法要强。 我不明白他的意思。有人可以解释一下吗?

8
对象的功能是否应仅由其实现的接口来标识?
C#的is运算符和Java的instanceof运算符允许您在已实现对象实例的接口(或更不幸的是,其基类)上分支。 根据接口提供的功能,将此功能用于高层分支是否合适? 还是基类应该提供布尔变量以提供一个接口来描述对象具有的功能? 例: if (account is IResetsPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); 与 if (account.CanResetPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); 使用接口实现进行功能识别是否有陷阱? 这个例子就是一个例子。我想知道一个更通用的应用程序。

2
为什么采用数量不受限制的参数的方法通常会定义带有较少参数的重载?
例如,System.IO.Path.Combine.NET中的方法具有以下重载: Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) 最后三点是什么? 第一个将覆盖所有内容,就好像您仔细观察一样,它使用的是params关键字。向后兼容的论点仅涵盖该Combine(String, String)变体,因为它是.NET 4之前的唯一版本。

7
是否需要保留对简单(自包含)功能的测试?
考虑一下: public function polynominal($a, $b, $c, $d) { return $a * pow($x, 3) + $b * pow($x, 2) + $c * $x + $d; } 假设您为上述功能编写了各种测试,并向自己和其他人证明“它可以工作”。 为什么不删除这些测试,然后过上幸福的生活呢?我的观点是,某些功能在被证明可以正常工作后,无需对其进行连续测试。我正在寻找状态的对立点,是的,这些功能仍然需要测试,因为:...或者是的,这些功能不需要进行测试...

2
什么是第四代和第五代编程语言?还有更多吗?[关闭]
由于通常在学校/学院级别进行分类,因此流行的编程语言(C#,Java,C ++)都是第3代语言(从机器的物理部件中具有更高的抽象级别)。同样,汇编语言被分类为第二语言,机器语言被分类为第一代语言。 最初,我认为SQL应该被认为是第四代语言,因为它更抽象,并且与循环细节和描述性相去甚远。 刚才我发现有第四代和第五代语言,但是将任何编程语言或技术归为第四代或第五代语言的基础是什么? 另外,还有第六代或第七代语言吗?

9
学校为什么要在List上教数组?[关闭]
我学校中大部分的初始编程课程作业都要求我使用数组。我现在全职工作,而且从未将数组用于我从事的任何项目。即使在现有的项目中,我也从未见过在任何地方使用数组。我认为,List更易于使用,是一个标准。教授为什么要告诉学生在作业中使用数组?只是为了让学生了解基础知识? 由于大多数大学都教授Java,因此这个问题是Java特有的。

7
在很少的时间内如何做出重要的技术决策
我有2天的时间对公司要使用的工具和平台做出非常认真的决定,以便将其WPF应用程序移植到Linux / Android / iOS。 显然,我可以指出,我的前辈说,只有2天时间不足以阅读所有可能的选择,以及尝试,制作原型等内容。我可以说,这对我没有帮助,我有2天的时间,并且2天后将做出决定。期。 一方面,我感到沮丧,另一方面,我认为这种方法有一定道理,否则,我很容易陷入很多下载的SDK,框架,API,博客文章等之中,沉迷于做基准工作,运行示例并忘记了过程的全部目的。 仍然我担心,错误的决定将使公司付出沉重的代价。那么,您认为做出此类决定的“理想”过程是什么?


5
在代码审查中给予正面评价是适当的,还是仅用于建设性批评?
我最近一直在进行大量代码审查,但是我不确定在代码审查中添加正面和/或有趣的评论会带来正面和负面的影响以及专业性。 我们使用Github作为我们团队中的代码审查平台,因此任何人都可以查看注释。我通常会尝试使用该平台,因此从头到尾的整个过程都是可见的和历史性的。

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.