软件工程

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

6
有处理冲突的功能参数的模式吗?
我们有一个API函数,可根据给定的开始日期和结束日期将总金额细分为每月金额。 // JavaScript function convertToMonths(timePeriod) { // ... returns the given time period converted to months } function getPaymentBreakdown(total, startDate, endDate) { const numMonths = convertToMonths(endDate - startDate); return { numMonths, monthlyPayment: total / numMonths, }; } 最近,此API的消费者希望以其他方式指定日期范围:1)通过提供月数而不是结束日期,或2)通过提供每月付款并计算结束日期。为此,API小组将功能更改为以下内容: // JavaScript function addMonths(date, numMonths) { // ... returns a new date …
38 api-design 

3
集成测试如何批评设计?
我正在JB Rainsberger的博客中阅读有关集成测试的文章,并想知道集成测试对我们的设计而言哪种方式更为苛刻? 我们编写了更多的集成测试,这些测试更大,并且不会像微型测试那样苛刻地批评我们的设计。


10
变量和存储位置有什么区别?[关闭]
最近,我一直在尝试以视觉方式将指针解释为抽认卡。 问题001:这是计算机内存中某个位置的图形。它的地址是真的0x23452吗?为什么? 答:是的,因为0x23452描述了计算机可以在哪里找到此位置。 问题002:字符b存储在存储单元中是否正确0x23452?为什么? 答:不,因为字符a实际上存储在其中。 问题003:指针存储在存储单元中是否正确0x23452?为什么? 答:是的,因为存储位置的地址0x34501存储在其中。 问题004:指针是否存储在存储单元内是否正确0x23452?为什么? 答:是的,因为另一个存储位置的地址存储在其中。 现在,让我担心的部分。一位软件工程师这样向我解释了一些建议: 指针是一个变量,其值是另一个变量的内存地址。 根据我向大家展示的四个抽认卡,我将以略有不同的方式定义指针: 指针是一个存储位置,其值是另一个存储位置的存储地址。 可以肯定地说变量与存储位置相同吗? 如果没有,那么谁是对的?变量和存储位置有什么区别?

5
当您无法确定布尔值时该怎么办?
我们正在为公司构建一个Web应用程序,到目前为止,该管理仅存在于Excel工作表中。到现在我们已经差不多完成了,但是最近我被分配了一个任务,将所有数据从这些工作表导入到我们的新系统中。该系统是用Java构建的,但是由于这种导入只是一次性的事情,因此我决定改用Python编写脚本,然后直接通过SQL查询将其导入。问题来了。新数据模型包含一些新属性,这些新属性未包含在其现有数据中。在大多数情况下,这不是问题,我在找不到信息的地方放了一个null。但是随后我遇到了一些属性,它们是布尔值,默认情况下不能为NULL。首先,我尝试只允许数据库中的这些字段为空,但是我的资深开发人员告诉我不要这样做,因为这将来会在我们的系统中引起问题。现在我不太确定该怎么做。显而易见的解决方案是将每个未知布尔值默认设置为false,但是我认为这也是错误的,因为我实际上不知道它是否为false。 示例:假设您有一个具有hasRadio参数的实体Car。现在,您需要将数据导入此数据模型,但是在数据中只有“模型”和“颜色”列,关于是否具有无线电没有任何内容。如果设计上不能将其设置为空,那么您将在“ hasRadio”列中添加什么? 在这种情况下最好的方法是什么?我们是否应该告诉公司手动填写丢失的数据?还是默认为false?

7
创建块只是为了减小变量的范围是否有意义?
我正在用Java编写程序,有一次我需要为密钥库加载密码。只是为了好玩,我尝试通过执行以下操作使密码尽可能短: //Some code .... KeyManagerFactory keyManager = KeyManagerFactory.getInstance("SunX509"); Keystore keyStore = KeyStore.getInstance("JKS"); { char[] password = getPassword(); keyStore.load(new FileInputStream(keyStoreLocation), password); keyManager.init(keyStore, password); } ... //Some more code 现在,在这种情况下,我知道这有点愚蠢。我还可以做很多其他事情,其中​​大多数实际上更好(我根本不能使用变量)。 但是,我很好奇在某些情况下这样做不是那么愚蠢。我唯一想到的另一件事是,如果您想重用通用变量名,如count或temp,但是良好的命名约定和简短的方法使其不太可能有用。 在某种情况下,仅使用块来减小变量范围有意义吗?
38 java  variables  scope 

6
如何正确定位数字?
在前端应用程序中本地化数字时应注意哪些注意事项? 示例:在巴西葡萄牙语(pt-BR)中,我们用点分隔小数,用逗号分隔小数。在美国英语(en-US)中则相反。在pt-BR中,我们显示以千位分隔的数字,与en-US相同。但是,今天阅读有关印度英语(en-IN)的信息时,我偶然发现了这个宝石: 印度编号系统是数字分组的首选。用文字或口语表达时,小于100,000 / 100 000的数字与标准英语中的数字相同。在印度编号系统的子集中表示的数字包括100,000 / 100000以上。 https://zh.wikipedia.org/wiki/Indian_English#Numbering_system 意思是: 1000000 units in pt-BR are formatted 1.000.000 1000000 units in en-US are formatted 1,000,000 1000000 units in en-IN are formatted 10,00,000 除了逗号和点以及其他特定的分隔符外,似乎遮罩也是一个有效的问题。 在前端应用程序中本地化数字时,我还应该注意哪些其他警告?特别是如果我要向非拉丁字符集显示数字?

5
您是否应该始终为网站的服务器端编程?
我即将开始为朋友创建一个音乐项目网站。现在它应该很简单:没有动态内容(游览日期等),只不过是一些嵌入式样本歌曲或SoundCloud链接。我不希望在响应式网格上使用除香草JavaScript和Bootstrap或Foundation之外的任何东西。 够了吗?我可以简单地将HTML,CSS和JS文件上传到主机并完成操作,还是应该花时间在Node或PHP中对后端服务器进行编程?

6
使用.dll文件比将.cs文件链接到项目的优势(对于我自己的通用帮助程序类/扩展方法)
我有一个帮助程序项目,可在我创建的所有应用程序中使用。它包含一些扩展方法和一堆通用帮助程序类,控件等。我会不时更新/扩展帮助程序项目。这些通常是小型且无关的项目,而我是唯一从事这些项目的人。 我尝试了两种使用方法 将.cs文件直接添加(添加为链接)到使用它们的每个项目中 将其编译为.dll并将其添加为参考 我看到了这些方法的一些优点和缺点。 第一个: 更简单,因为帮助程序类被编译到exe文件中,所以我经常可以很容易地提供一个可以正常工作的.exe文件。因为我添加为链接,所以我可以肯定的是,每当构建使用该帮助程序的任何项目时,该帮助程序文件都是最新版本。 甚至更简单,因为我可以分开文件,因此可以在.NET 4.0上良好运行的扩展方法与需要.NET 4.5的扩展方法分开引用,这意味着整个应用程序都可以在.NET 4.0上运行 允许通过代码进行调试,并具有断点等的所有优点。 似乎不是“最佳实践” 第二个: 似乎是正确的方法,但是: 需要我提供一个单独的.dll文件,由于某种原因,该文件对用户来说要困难得多(他们倾向于在没有.dll的情况下共享我的程序,然后该文件在启动时崩溃) 当它被编译成一个.dll时,它将需要.NET的最高版本-我的许多用户都没有.NET 4.5,并且只有我的helper类的某些元素需要这样做,这意味着我可以强迫某些人无故更新他们的系统 我还需要确保每当我更新任何程序时,我都还提供.dll文件-即使我不知道自上一个版本以来是否已对其进行过更改(可能已经更改了,但是它最好是同一版本)。在不跟踪程序集版本的情况下,我看不到一种简单的确定方法,这是额外的工作。现在,当我更新程序时,我只提供更新的exe,并且我希望使其保持小巧和低调。 那么,在这里使用.dll文件的实际好处是什么?请注意,我是唯一编辑所有应用程序和帮助文件的代码的人。 另外,需要澄清的是-应用程序通常很少,而helper类中包含的代码对所有应用程序都是完全通用的(一些简单的字符串比较,路径或XML操作等) 实际上,有人让我意识到刚才还有第三种选择。由于我在separte项目中具有帮助程序代码,因此可以将该项目添加到我每个单独应用程序的解决方案中-该工作方式类似于针对单个文件的“添加为链接”,但我只添加了一个项目...但是正如Doc Brown所注意到的,这实质上意味着无论如何都需要将.dll添加到项目中... 另一种有利于不使用dll文件的事情是能够主动地通过helper类进行调试...
38 c#  dll 

6
偏爱OOP语言后如何思考C程序员?[关闭]
以前,我只使用过面向对象的编程语言(C ++,Ruby,Python,PHP),现在正在学习C。我发现很难找出用一种没有概念的语言来做事的正确方法。 '宾语'。我意识到可以在C语言中使用OOP范例,但是我想学习C语言惯用的方式。 解决编程问题时,我要做的第一件事是想象一个可以解决该问题的对象。使用非OOP命令式编程范例时,我可以用哪些步骤替换它?

4
试图理解P vs NP vs NP Complete vs NP Hard
我试图理解这些分类以及它们为什么存在。我的理解正确吗?如果没有,那怎么办? P是多项式复杂度,或对于某些非负实数(例如)等。如果问题属于P,则至少存在一种可以在多项式时间内从头解决的算法。例如,我总是可以通过遍历并检查每一步是否除以整数来确定某个整数是否为质数。O(nk)kO(1), O(n1/2), O(n2), O(n3)n2 <= k <= sqrt(n)kn NP是不确定的多项式复杂度。我真的不知道不确定性意味着什么。我认为这意味着在多项式时间内进行验证很容易,但是如果我们不知道答案,那么从头开始求解可能不是多项式时间。由于它可以在多项式时间内求解,因此所有P问题也是NP问题。引用整数分解作为NP的示例,但我个人不理解为什么它不是P,因为试验分解需要O(sqrt(n))时间。 NP完全我完全不了解,但是引用了旅行商问题。但是在我看来,TSP问题可能只是NP,因为它需要采取某种措施来验证您是否已预先确定路径。O(2n n2) time to solve, but O(n) 我认为NP-Hard充满未知数。难以验证,难以解决。

3
实际上值得对API客户端进行单元测试吗?
这已经让我困扰了一段时间。实际上值得对API客户端进行单元测试吗? 假设您正在创建一个小类,以抽象化对petshop REST API的调用。petshop是一个非常简单的API,它具有一组基本方法: listProducts() getProductDetails(ProductID) addProduct(...) removeProduct(ProductID) 在测试时,我们必须创建一个模拟服务或模拟响应。但这似乎太过分了;我知道我们想确保我们的方法不会因拼写错误/语法错误而停止工作,但是由于我们正在编写调用远程方法的函数,然后又从这些远程方法创建虚假响应,因此看起来浪费了很多精力,而我们正在测试的是不可能真正失败的东西。更糟糕的是,如果更改远程方法,则在生产使用失败时,我们的单元测试将通过。 我很确定自己丢失了某些东西,或者棍子的末端错了,或者我没有看到树木的木头。有人可以让我走上正确的路吗?
38 unit-testing  api 

5
通过对象本身的方法还是通过另一个类保存对象?
如果要保存和检索对象,是否应该创建另一个类来处理该对象,还是最好在该类本身中进行处理?还是混合两者? 根据OOD范式推荐哪个? 例如 Class Student { public string Name {set; get;} .... public bool Save() { SqlConnection con = ... // Save the class in the db } public bool Retrieve() { // search the db for the student and fill the attributes } public List<Student> RetrieveAllStudents() { // this …

2
现代语言是否仍使用解析器生成器?
我是研究关于gcc编译器套件在维基百科这里,当这想出了: GCC开始使用由Bison生成的LALR解析器,但后来逐渐切换为手写递归下降解析器。2004年用于C ++,2006年用于C和Objective-C。目前,所有前端都使用手写递归下降解析器 因此,在最后一句话中,(以及我所信任的维基百科),我可以肯定地说:“ C(gcc),C ++(g ++),Objective-C,Objective-C ++,Fortran(gfortran),Java(gcj), Ada(GNAT),Go(gccgo),Pascal(gpc),... Mercury,Modula-2,Modula-3,PL / I,D(gdc)和VHDL(ghdl)”都是前端,不再使用解析器生成器。也就是说,它们都使用手写的解析器。 我的问题是,这种做法无处不在吗?具体来说,我在[Python,Swift,Ruby,Java,Scala,ML,Haskell]中寻找x的“ x的标准/官方实现是否具有手写的解析器”的确切答案?(实际上,这里也欢迎提供其他语言的信息。)我敢肯定,经过大量的挖掘,我可以自己找到它。但是,我也相信社区很容易对此负责。谢谢!

3
什么是参照透明性?
我已经看到在命令式范式中 f(x)+ f(x) 可能与以下内容不同: 2 * f(x) 但是在功能范式中应该相同。我曾尝试在Python和Scheme中实现这两种情况,但对我来说,它们看起来非常简单。 有什么例子可以指出与给定功能的区别?

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.