软件工程

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

5
为什么我们需要动态类型语言的枚举?
我在这里阅读一些代码,发现一个枚举用于存储html标签的名称。为什么我们需要这样做?使用此策略有什么好处? 我知道枚举在编译或静态类型的语言中有多么有用,但是当我看到动态类型的语言中的枚举时,我会感到好奇,就像上面显示的示例代码一样。因此,问题基本上可以归结为为什么我们需要使用动态类型语言的枚举,或者根本不需要它们?

8
Java中哪种样式更好(实例变量与返回值)
当我需要在类中的某些方法中使用公共数据时,我常常会努力决定要使用这两种方法中的哪一种。有什么更好的选择? 在此选项中,我可以创建一个实例变量,以避免必须声明其他变量,并且避免定义方法参数,但是可能不清楚在哪里实例化/修改这些变量: public class MyClass { private int var1; MyClass(){ doSomething(); doSomethingElse(); doMoreStuff(); } private void doSomething(){ var1 = 2; } private void doSomethingElse(){ int var2 = var1 + 1; } private void doMoreStuff(){ int var3 = var1 - 1; } } 还是只是实例化局部变量并将其作为参数传递? public class MyClass { MyClass(){ int var1 …

5
我们如何知道下一代会更好?
这篇MSDN文章最近向我介绍了遗传算法,他在其中将它们称为组合进化,但这似乎是同一回事,并且正在努力理解如何将两个潜在解决方案结合起来始终会产生一个新的解决方案,至少和父母一样好。 为什么会这样呢?当然,合并可能会导致更糟的情况。 据我了解,该算法基于这样的概念:当一个物种的雄性和雌性产生后代时,这些后代将具有父母双方的特征。有些组合会更好,有些会更差,有些也会一样。更好的(无论“更好”的定义是否适当)具有生存和产生具有改进特性的fpsring的更多机会。然而,将是比较弱的组合。为什么GA不会出现此问题?

5
不良做法-将案例切换到设置环境
在我担任开发人员的最近三年中,我看到了许多示例,这些示例中的人们使用switch语句设置URL的路径(后端和前端)。下面是一个示例: 后端示例(C#): public static string getHost(EnvironmentEnum environment){ var path = String.Empty; switch (environment) { case EnvironmentEnum.dev: path = "http://localhost:55793/"; break; case EnvironmentEnum.uat: path = "http://dev.yourpath.com/"; break; case EnvironmentEnum.production: path = "http://yourpath.com/"; break; } return path; } 前端示例(JavaScript): (function () { if (window.location.host.indexOf("localhost") !== -1) { window.serviceUrl = "http://localhost:57939/"; } else …

3
地址0000000C是一个特殊地址吗?
编程时有时会中断。您犯了一个错误,程序尝试从错误的地址读取。 在我眼前一亮的是,这些例外通常是: Access violation at address 012D37BC in module 'myprog.exe'. Read of address 0000000C. 现在,我看到了很多错误日志,而对我而言突出的是:0000000C。这是“特殊”地址吗?我看到了其他读取错误的访问冲突,但地址似乎是随机的,但是这种情况在完全不同的情况下会不断出现。

6
如果可以内联嵌套函数调用,为什么程序要使用调用堆栈?
为什么不让编译器采用这样的程序: function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; 并将其转换为这样的程序: function c(b) { return b^2 + 5 }; 从而消除了计算机记住c(b)的回信地址的需要? 我认为存储程序并支持其编译所需的硬盘空间和RAM分别增加,这就是我们使用调用堆栈的原因。那是对的吗?

3
在GOPATH之外拥有Go项目的源代码是一个坏主意
我正在使用Go进行一个新项目,而我们都是Go的新手。我们遵循标准的go目录结构,并将所有代码置于 $ GOPATH / src / github.com / companyname / projectname 这也是git仓库的根 推荐的标准路径布局确实有些奇怪,特别是如果我们正在开发多语言项目,例如基于Go的rest / http后端和html / javascript前端。在这种情况下,我可能希望我的项目结构如下所示: / doc/ src/ server/ main.go module1/ module.go client/ index.html Makefile 但是实际上是否需要将代码放置在GOPATH中? 作为尝试,我创建了一个小程序,其中的源代码在GOPATH之外。我可以轻松地将项目拆分为多个包,因此该main包可以使用引用文件夹中的一个foo包。foo/import "./foo" 据我所知,有两件事使我无法接受: 其他代码无法导入此代码。这不是问题,因为我们正在为公司专门构建服务。 我不能go install用来安装它。这也不是问题。构建管道将安装该工具。 但是,它确实允许构建服务器的工作区不位于GOPATH内 不鼓励这种方法吗?如果是这样,为什么呢? 除了我列出的两个副作用之外,还有其他副作用吗? 请记住,这是公司的私人项目,而不是公开的开源代码。 将实际项目从GOPATH中分离出来似乎很诱人,但是当您处于Shu阶段时,应该小心打破规则
32 go 

6
人们为什么要使用REST API而不是DBAL?
在过去的两家公司中,我曾经使用过REST API,用于通过Web应用程序查询数据。即。而不是让Web应用程序直接执行SQL,而是调用REST API,然后执行SQL并返回结果。 我的问题是...为什么要这样做? 如果它要暴露给第三方,我可以理解。比完整的数据库更好地公开有限的REST API。但是在这两家公司中并非如此。 有人向我建议,这些REST API使在DBMS之间进行切换更加容易。但这不是数据库抽象层(DBAL)的重点吗?也许您将ORM用作DBAL,或者您可能只编写原始SQL并让DBAL在适当的情况下转换特定于DB的内容(例如,将MySQL的LIMIT转换为MSSQL的TOP)。 无论哪种方式,对我来说似乎都是不必要的。而且我认为这也使诊断问题变得更加困难。如果Web应用程序上的报告给出了错误的数字,则您不仅可以转储SQL查询,还必须转储REST URL,然后进入用作REST API的项目,并从中提取SQL。因此,这是一个额外的间接层,减慢了诊断过程。

8
使用枚举列表是否是一个好习惯?
我目前正在一个有用户的系统上工作,每个用户都有一个或多个角色。在User上使用Enum值列表是一种好习惯吗?我想不出更好的办法,但这感觉还不错。 enum Role{ Admin = 1, User = 2, } class User{ ... List<Role> Roles {get;set;} }

5
为什么现在n层开发中的代码库现在有相等数量(甚至更多)的JavaScript代码?
我已经从事Web编程很长时间了,在某个地方,我无法知道为什么我们现在正在做我们所做的事情(或者我们是如何以这种方式来做事情的)? 我从基本的ASP Web开发开始,很早就在页面上混合了显示和业务逻辑。客户端开发之间千差万别(VBScript,不同的JavaScript风格),并且我们对服务器端验证有很多警告(因此我远离客户端逻辑)。 然后我搬到了ColdFusion了一段时间。ColdFusion可能是第一个使用其标签将显示和业务逻辑分开的Web开发框架。对我来说似乎很清楚,但非常冗长,并且ColdFusion的市场需求不高,所以我继续前进。 然后,我跳上ASP.NET的旅行车,开始使用他们的MVC方法。我还意识到Java似乎是企业系统的象牙塔语言,并尝试了MVC方法。后来,ASP.NET开发了这种MVVM设计模式,而Java(准确地说是J2EE或JEE)也很挣扎,并提出了其MVC2方法。 但是今天,我发现,后端编程不再是令人兴奋和进步的地方。而且,基于服务器端的MVC做法似乎已经过时了(人们真的不再使用JSTL吗?)。今天,在我从事的大多数项目中,我发现JavaScript框架和客户端开发是所有令人激动和创新的进步的来源。 为什么要进行从服务器到客户端的开发?我对我的一个JEE项目进行了简单的行计数,并且JavaScript中的代码行比Java多(第三方库除外)。我发现使用Java或C#等编程语言进行的大多数后端开发只是为了生成类似REST的界面,并且解决了显示,可视化,数据输入/输出,用户交互等所有艰苦的工作。通过诸如Angular,Backbone,Ember,Knockout等客户端框架... 在jQuery之前的时代,我看到了很多图,其中n层开发中的MVC中的M,V和C之间存在清晰的概念性界线。jQuery后,这些线在哪里绘制?看起来MVC和MVVM都可以在客户端的JavaScript代码中找到。 我想知道的是,为什么我们要进行这样的转换(从服务器端编程的重点到客户端的方方面面,从偏爱编译语言到脚本语言,从命令式到功能性编程,所有这些似乎都是同时发生的) ),此过渡/转移解决了哪些问题?

10
如果可以使用后者,那么“父项x = new Child();”而不是“ Child x = new Child();”是一种不好的做法吗?
例如,我看过一些代码创建了这样的片段: Fragment myFragment=new MyFragment(); 它声明一个变量为Fragment而不是MyFragment,MyFragment是Fragment的子类。我对这行代码不满意,因为我认为该代码应为: MyFragment myFragment=new MyFragment(); 哪个更具体,是真的吗? 还是概括地说,使用以下做法是错误的做法: Parent x=new Child(); 代替 Child x=new Child(); 是否可以在没有编译错误的情况下将前一个更改为后一个?

3
依赖注入如何增加耦合?
在有关依赖项注入的Wikipedia页面上,劣势部分告诉我们: 依赖注入通过要求子系统的用户满足该子系统的需求来增加耦合。 链接到反对依赖注入的文章。 依赖注入使类使用接口而不是具体的实现。那应该导致耦合减少,不是吗? 我想念什么?依赖注入如何增加类之间的耦合?

4
最少知识原理
我了解最少知识原理的动机,但是如果尝试将其应用到我的设计中,则会发现一些缺点。 我在《Head First Design Patterns》一书中发现了该原理的一个示例(实际上是如何不使用它)指定,根据该原理,调用从其他方法返回的对象上的方法是错误的。 但是似乎有时非常需要使用这种功能。 例如:我有几个类:video-capture类,编码器类,streamer类,它们都使用一些基本的其他类VideoFrame,并且由于它们彼此交互,因此它们可以执行以下操作: streamer 班级代码 ... frame = encoder->WaitEncoderFrame() frame->DoOrGetSomething(); .... 如您所见,此原理在这里不适用。可以在这里应用该原理,还是不能总是在这样的设计中应用该原理?

5
为什么Windows / Linux不使用关系数据库(RDBMS)?
Windows / Linux为什么不使用关系数据库(RDBMS)? 我知道他们使用文件系统来存储所有数据,但是您不认为像在网站/ Web应用程序中那样使用数据库会更有效吗? 请详细说明如何通过数据库使用文件系统进行存储。 这与“ 何时应优先使用数据库而不是从文本文件中解析数据”相重复?我仅在操作系统上下文方面进行讨论,而这个问题是笼统的。


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.