软件工程

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

3
Windows 7上的Windows Phone 8开发-是否可能?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我试图在Windows 7计算机上安装Windows Phone 8 SDK,但它提示“仅Windows 8支持”。我实际上想在Visual Studio 2012上开发Phone 7.5应用程序,而使用7.1 SDK则无法实现,所以我认为8 SDK可以胜任。 似乎8 SDK发行时就没有足够的争议,现在它已经可以普遍使用了,对我来说,仅将其提供给Windows 8似乎是一个可怕的决定,因为在我看来,没有认真而又理智的开发人员会这样做。仅由于Metro UI才安装Windows 8,或者至少在不久的将来。 因此,有谁知道在Windows 7上开发Windows Phone 8的任何变通办法,或者至少为7.5但使用Visual Studio 2012进行开发?


1
为什么面向对象的范例要花这么长时间才能成为主流?
我读了这个问题,这让我开始思考另一件事。面向对象的语言。我不确定第一个是何时创建的,但是为什么要花这么长时间才成为主流? C变得非常流行,但是多年之后(数十年?)才没有成为面向对象的C ++。 90年代以前没有主流语言是面向对象的 面向对象确实似乎在Java和C ++的同时流行 现在,我的问题是,为什么要花这么长时间?为什么C最初不被认为是一种面向对象的语言?只使用一小部分C ++不会对核心语言产生很大的影响,所以为什么这个想法直到90年代才流行起来?

3
诸如Stack Overflow之类的支持网站会否破坏付费支持的开源模型?
为了保持与市场的联系,我正在为我的软件公司研究新的业务模型。带有付费支持的开源模型似乎很适合我们的产品,但是我担心付费支持模型在这样的时代是否可行,在这个时代中,像Stack中的那些站点一样免费提供一流的帮助交换网络。 恰当的例子-去年,我因为不想支付Win 7许可证和新硬件的费用而将员工迁移到Ubuntu,而且Mono平台非常吸引人。我的员工没有Linux经验,但是在AskUbuntu,Stack Overflow和几本“ For Dummies”书籍的帮助下,能够在大约120天内实现相对能力。我们确实聘用了Ubuntu顾问7天来提供培训和支持,但除此之外,还花费了0.00美元用于任何形式的有偿专业知识。 关于我的尽职调查,我与一个较小的客户进行了为期3个月的免费增值支持模式的beta测试,并取得了中等水平的结果。我想这样想是因为我们的软件是如此稳定且易于使用,以至于客户不需要太多的付费支持,但是我怀疑他们绕过了我们SLA的条款,就像我们转向Ubuntu的。 是否有人对我正在考虑的举动有任何想法,建议或经验?什么有效,什么无效,等等?


2
坚持自然语言处理解析数据
我最近开始使用斯坦福大学的CoreNLP进行自然语言处理(NLP)的实验,并且想知道为文本挖掘应用程序之类的东西存储NLP解析数据的一些标准方法是什么? 我认为可能有趣的一种方法是将子级存储为邻接列表,并充分利用递归查询(Postgres支持此功能,我发现它确实很好用)。 但我认为,根据多年来从事该领域工作的人员所进行的分析类型,可能有许多标准方法可以执行此操作。那么NLP解析数据的标准持久性策略是什么?如何使用它们?

7
递归函数可以有迭代/循环吗?
我一直在研究递归函数,很显然,它们是可以自我调用的函数,并且不使用迭代/循环(否则它将不是递归函数)。 但是,在网上浏览示例(8皇后递归问题)时,我发现此功能: private boolean placeQueen(int rows, int queens, int n) { boolean result = false; if (row < n) { while ((queens[row] < n - 1) && !result) { queens[row]++; if (verify(row,queens,n)) { ok = placeQueen(row + 1,queens,n); } } if (!result) { queens[row] = -1; } }else{ result = …
12 java  recursion 

4
分配给新对象时切换或字典
最近,我开始倾向于使用Dictionaries而不是Switch语句来映射1-1关系。我发现它的编写速度更快,并且在心理上也更容易处理。不幸的是,当映射到对象的新实例时,我不想这样定义它: var fooDict = new Dictionary<int, IBigObject>() { { 0, new Foo() }, // Creates an instance of Foo { 1, new Bar() }, // Creates an instance of Bar { 2, new Baz() } // Creates an instance of Baz } var quux = fooDict[0]; // quux references Foo …
12 c#  coding-style 

3
如何记录实验性或不完整的API,例如@deprecated?
是否有一个与“不赞成使用”相似但又不同的好术语,表示方法或API已存在于代码库中,但由于其实现不完整或可能会发生变化而不应使用?(是的,我知道,这些方法不应该公开,yada yada yada。我没有创造自己的情况,我只是想尽力而为。) 人们有什么建议?实验性的,不完整的,还有其他吗? 如果我正在为该API构建仍在不断变化的javadoc文档,那么我应该使用@deprecated标记还是有更好的约定?对我而言,@ preprecated表示此API很旧,可以使用更新的首选机制。在我的情况下,别无选择,但是API中的某些方法尚未完成,因此不应使用。目前,我无法将其设为私有,但我想在文档中添加明确的警告。

1
合并分支的有用git commit消息
作为此问题的后续措施: 如果我自己一个团队工作,那么在合并分支时,可以通过将所有提交压缩到单个差异中然后合并该差异来维护有用的提交消息。这样,我可以轻松地看到分支中引入了哪些更改,并且我只有一个摘要来描述浏览主分支时该分支中完成的功能/更改/所做的一切。 我现在的问题是,与团队合作时该如何完成?在这种情况下,分支将被推送到远程存储库,这意味着我无法将分支中的所有提交压缩为单个commit。如果分支是公共分支,则master分支中仍可以有一个有用的合并提交吗?(“有用”是指主行中的提交告诉我(1)分支中所做的操作的有用摘要,以及(2)分支的差异。)
12 git  branching 

2
寻找一些面向对象的设计建议
我正在开发一个应用程序,该应用程序将用于在工业环境中打开和关闭阀门,并且正在考虑这样的简单操作:- public static void ValveController { public static void OpenValve(string valveName) { // Implementation to open the valve } public static void CloseValve(string valveName) { // Implementation to close the valve } } (该实现会将一些字节的数据写入串行端口以控制阀门-从阀门名称派生的“地址”,以及“ 1”或“ 0”来打开或关闭阀门)。 另一个开发人员问我们是否应该为每个物理阀创建一个单独的类,其中有几十个。我同意,最好使用PlasmaValve.Open()而不是编写类似的代码ValveController.OpenValve("plasma"),但这是否太过分了? 另外,我想知道如何最好地考虑到一些假设的未来需求: 我们被要求支持一种新型的阀门,该阀门需要不同的值来打开和关闭它(不是0和1)。 我们被要求支持可以设置在0-100之间的任何位置的阀,而不是简单地“打开”或“关闭”。 通常,我会在这种情况下使用继承,但是最近我开始着手解决“继承之上的组合”问题,并想知道使用组合是否有一个更好的解决方案?

2
分离Java项目
我有一个大型的Java项目,我们在构建周期中使用了maven。这个项目被广泛使用-在其他项目中,在各种应用程序中,其中一些包含在其中,有些则在其他地方...老实说,这有点混乱(针对特定时间,在不同时间添加了不同的位目的),我想对其进行清理。另外,它还没有经过完全测试(没有适当的单元和集成测试就添加了很多位),并且有些测试需要很长时间才能运行或实际上没有通过……(嗯)测试在Maven构建周期中关闭(再次,呃,哦)。 我正在考虑将这个大型项目分成较小的特定项目,以使“最终”子项目(或几个子项目)可以选择所需的各个子项目。 我的想法如下: 如果我将一个大型项目分为多个子项目,这将清楚说明每个项目的责任。 通过分成多个子项目,我可以分别清理每个子项目的测试,然后在maven构建周期中打开该子项目的测试。 我有点担心这可能会对构建时间产生影响。 在大型项目上(即放入较小的子项目中)采用结构会减慢编译器的速度吗? 另外,我对这可能会对IDE中的编辑时间产生什么影响(我们主要使用Intellij)略有担忧。Intellij似乎是通过依赖关系树依次构建每个项目的-例如,如果C依赖于B依赖于A,而我更改了A,除非A进行编译,否则它不会尝试构建B。可以说这是有好处的,但是我发现,例如,如果我更改了A在B和C中广泛使用的接口,则需要花费一些时间来修复该更改中的所有错误... 另一个问题是如何使用工厂类。该项目的某些方面取决于外部罐子。有时(非常不经常)更新这些内容,因此我们必须进行迁移。我们倾向于使用Factory类来处理此问题,该类指向外部代码的正确版本(因此,我们不必在整个代码库中更改所有实现)。 目前,这一切都在大型项目中,但是我认为通过切换到子项目,我可以开发一个新项目来实施新的外部代码,确保子项目功能完整并经过测试,并且然后在用户项目中切换依赖项/工厂类。但是,由于在整个大型项目中大量使用接口,因此使情况变得更加复杂。例如 子项目A-包含接口 子项目B-取决于A的接口和旧的外部jar 子项目C-依赖于B(以及A和旧的外部jar),并且包含一个使用B的接口实现的Factory类。 如果需要更改B的外部jar,我可以: 创建子项目B_ii-再次取决于A,现在取决于新的外部jar 一旦功能完备,我可以将C的依赖项添加到B_ii,并更改Factory类以使用接口的新实现。 当这一切正常的时候,我就可以删除C对原始B的依赖关系,如果需要,可以删除子项目B。 这是明智的做法吗? 因此,总的来说,我的问题是: 有没有人有分解大型项目的经验?您是否愿意分享任何提示/技巧? 这对您的开发和构建时间有什么影响? 您可以在构建此类项目的分解方面提供什么建议?

2
编写发行说明的良好做法
在交付每个版本的软件时,我们都必须编写发行说明。例如,以下是我写发行说明时添加的一些术语: 发布日期 错误解决 够了,还是还有别的吗?
12 release 

2
有什么优雅的方法可以分析工程师的过程吗?
存在很多观点认为衡量提交是不合适的。 有没有做过任何尝试吸引更多资源而不是提交的研究,例如: 浏览模式 IDE工作(预提交) 空闲时间 多任务 我想不出一种简便的方法来执行这些措施,但是我想知道是否已经进行了任何研究。 就个人而言,我确实认为,反思自己的“指标”可能是有价值的,无论(或不使用)这些指标进行绩效评估。IE浏览器会以一种无偏见的方式来反映您的习惯。但这是问答之外的讨论问题。

2
FP用于仿真和建模
我将要开始一个模拟/建模项目。我已经知道OOP用于此类项目。但是,研究Haskell使我考虑使用FP范例对组件系统进行建模。让我详细说明: 假设我有一个类型A的组件,其特征是一组数据(如温度或压力,PDE和某些边界条件等参数),以及一个类型B的组件,其特征是一组不同的数据(不同或相同的参数,不同的PDE和边界条件)。我们还假设将要应用于每个组件的函数/方法是相同的(例如,Galerkin方法)。对象的可变状态将用于非恒定参数。 如果要使用OOP方法,我将创建两个对象,这些对象将封装每种类型的数据,解决PDE的方法(继承将在此处用于代码重用)和PDE的解决方案。 另一方面,如果我要使用FP方法,则每个组件都将分解为数据部分和对数据起作用的功能,以获得PDE的解决方案。非常数参数将作为其他函数(例如时间)传递或由某种可变性(可变性的仿真等)表示。假设对数据进行线性运算是微不足道的,这种方法对我来说似乎更简单。 总之,与OOP相比,实施FP方法实际上是否更简单,更易于管理(添加不同类型的组件或新方法来解决pde)? 我来自C ++ / Fortran,而且我不是专业程序员,所以请在出现任何错误的地方进行纠正。

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.