软件工程

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

3
面向对象语言的非面向对象编程
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 最近,我被分配了一项任务,即使用面向对象编程来创建具有加,减,乘,除和乘幂功能的计算器。我成功完成了这项任务。但是之后,我重新编程了整个程序,而没有使用面向对象的技术/方法。 我注意到我的代码长度大大减少了,这是可以理解的。所以我的问题是,什么时候应该使用面向对象编程?是否可以使用面向对象的语言来创建没有面向对象的程序?请帮助我解决这一问题。 PS:我不是要在这里告诉我面向对象编程优于过程编程的优点。

4
如何进行测试驱动开发
我在应用程序开发方面只有2年以上的经验。在那两年中,我对发展的态度如下 分析需求 身份核心组件/对象,必需功能,行为,过程及其约束 创建类,它们之间的关系,对象行为和状态的约束 根据要求创建功能,处理行为约束 手动测试应用 如果需求更改修改组件/功能,则手动测试应用程序 最近,我对TDD进行了介绍,并认为这是进行开发的好方法,因为已开发的代码有充分的理由存在,并且可以缓解许多后期部署问题。 但是我的问题是我不能先创建测试,而是要标识组件,并在实际编写组件之前为它们编写测试。我的问题是 我做对了吗?如果不是,我到底要改变什么 有什么方法可以确定您编写的测试是否足够? 是针对非常简单的功能(相当于1 + 1 = 2)编写测试的好习惯吗? 更改功能并相应地测试需求是否有所变化是否很好?

3
待办事项列表的数据库架构
我正在尝试使用PHP,MySQL,Jquery模板和JSON创建一个非常简单的待办事项列表应用程序。但是,我的架构似乎使JSON变得复杂。 最好的方法是什么? 每个列表的新表,其中包含项目。 要么 一个用于列表的表,以及一个以某种方式连接的项目的表?因为我已经尝试过了,这似乎不是正确的方法?范例http://jsfiddle.net/Lto3xuhe/

9
说服高层管理人员考虑使用函数式编程,有什么好的事实依据?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 对于为什么函数式编程是一个好主意,有大量的“理论”论证(要解决一个开放的问题,太多了,这是正确的)。 但是,大多数都是基于理论(“优雅”等)或针对开发人员的论证。 问题是,当他们的目标是向大公司的高级管理层介绍这个想法时,大多数人完全没有用,其中一些人甚至都不是开发人员,而所有人都在乎业务论点:成本,人力资本管理,产品交付,客户服务和收入;以及理论上无法完全支持的定量事实。 就考虑将功能性编程作为一种概念(不是任何特定的语言)进行考虑,相对于过程/ OOP的典型组合,例如Java / C ++ /(Perl | Python),是否有任何令人信服的论点可以解决这些业务问题?。 最好是,我正在寻找定量的和/或基于研究或案例研究的论据。例如,“根据此参考,Lisp / F#中的多线程系统的错误率是Java的10%”或“ 80%的顶尖毕业生表示对期望的技术(称为函数式编程)的偏爱是前三大兴趣之一”。 我知道Graham提出了函数式编程的用例以备不时之需,并假设他的某些论点对较大的成熟公司有效,对此他持开放态度。 psI完全意识到,您可以在Perl中完成类似于函数式编程的工作,可能是Python,甚至(甚至)Java 8或C ++14。但是,这并不意味着使用Perl,C ++或Java的组织会认可函数vs即使是那些语言中的OOP /过程方法 就此语言而言,“大”定义为足以拥有专门的开发工程/工具组的大小,该组指示允许所有开发人员使用/执行的操作;至少有数百名低端开发者。

2
出于对临时性的引用,该归咎于谁?
乍一看,以下代码看起来无害。用户使用该功能bar()与某些库功能进行交互。(自从bar()返回对非临时值或类似值的引用以来,这甚至可能已经工作了很长时间。)但是现在,它只是返回的新实例B。B再次具有一个函数a(),该函数返回对可迭代类型的对象的引用A。用户希望查询该对象,这会导致段错误,因为迭代开始之前销毁了B返回的临时对象bar()。 我不确定是谁(图书馆或用户)对此负责。所有库提供的类对我来说看起来都很干净,并且肯定没有做任何其他事情(返回对成员的引用,返回堆栈实例等)。用户似乎也没有做错任何事情,他只是在迭代某个对象而没有做任何与该对象寿命有关的事情。 (一个相关的问题可能是:应该建立一个通用规则,即代码不应对循环头中多个链接调用所检索的内容进行“基于范围的迭代”,因为这些调用中的任何一个都可能返回a右值?) #include <algorithm> #include <iostream> // "Library code" struct A { A(): v{0,1,2} { std::cout << "A()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } int * begin() { return &v[0]; } int * end() { return &v[3]; } int v[3]; }; struct B { …
15 c++11 

5
当定义写在源代码的末尾时,为什么需要用C语言对数据和函数进行“声明”?
考虑下面的“ C”代码: #include<stdio.h> main() { printf("func:%d",Func_i()); } Func_i() { int i=3; return i; } Func_i()是在源代码的末尾定义的,并且在main()。中使用之前没有提供声明。在编译器Func_i()进入的时候main(),它出来main()并找到了Func_i()。编译器会以某种方式找到返回的值Func_i()并将其提供给printf()。我也知道,编译器无法找到返回类型的Func_i()。它在默认情况下需要(猜测?)的返回类型的Func_i()是int。就是说,如果代码具有float Func_i(),编译器将给出错误:的类型冲突Func_i()。 从上面的讨论中我们看到: 编译器可以找到由返回的值Func_i()。 如果编译器可以找到返回的值Func_i()由未来的出来main()和向下搜索源代码,那么为什么就不能找到Func_i(),它的类型明确提及。 编译器必须知道它Func_i()是float类型的-这就是为什么它会产生冲突类型的错误的原因。 如果编译器知道该Func_i类型为float类型,那么为什么仍假定它Func_i()为int类型,并给出类型冲突的错误?为什么不强制使它Func_i()成为float类型。 我对变量声明也有同样的疑问。考虑下面的“ C”代码: #include<stdio.h> main() { /* [extern int Data_i;]--omitted the declaration */ printf("func:%d and Var:%d",Func_i(),Data_i); } Func_i() { int i=3; return i; } int Data_i=4; 编译器给出错误:未声明“ Data_i”(此函数中的首次使用)。 当编译器看到 Func_i(),它会进入源代码以查找Func_()返回的值。为什么编译器不能对变量Data_i做同样的事情? …

2
对于域驱动的设计RESTful Web服务,这是否是一个好的Visual Studio解决方案结构?
我正在构建.NET 4.5 C#Web API RESTful解决方案,我想告诉我我的项目解决方案对于使用域驱动设计设计的解决方案是否正确和/或明智(足够?)。 该解决方案已分为6个项目: /基础 (没有任何引用) 该Web项目构成了解决方案与外界之间的接口。包含Web API控制器。除了从请求对象中收集值并要求BizApi层工作以外,几乎没有任何逻辑。 /Biz.Api (由基础引用) 提供域服务,并允许/ Base接口项目访问/Biz.Domain项目中的域业务逻辑对象。 /Biz.Domain (由Biz.Api引用) 提供Biz.Api层的域类。这些提供了操作内存中业务数据的方法。 /Dal.Db (由Biz.Api引用) 数据库存储库层。访问数据库并将返回的数据映射到/ Interfaces层中定义的内部DTO。 /Dal.Services (由Biz.Api引用) 为外部依赖项(如Web服务)提供代理层,并将其返回的数据映射到/ Interfaces项目中定义的内部DTO。 /接口 (以上大多数项目引用) 包含用于在解决方案中传递数据的DTO类和用于为IoC之类的合同定义合同的C#接口。

6
使用朋友类在C ++中进行单元测试私有方法
我知道这是一个有争议的做法,但是让我们假设这对我来说是最佳选择。我想知道执行此操作的实际技术是什么。我看到的方法是这样的: 1)与我要测试的方法的班级做一个朋友班。 2)在friend类中,创建一个公共方法,该公共方法调用被测试类的私有方法。 3)测试好友类的公共方法。 这是一个简单的示例来说明上述步骤: #include <iostream> class MyClass { friend class MyFriend; // Step 1 private: int plus_two(int a) { return a + 2; } }; class MyFriend { public: MyFriend(MyClass *mc_ptr_1) { MyClass *mc_ptr = mc_ptr_1; } int plus_two(int a) // Step 2 { return mc_ptr->plus_two(a); } private: …

4
仅出于更好的可读性而将集合包装在一个简单的类中是否为时过早?
我有以下地图: Map<Double, List<SoundEvent>> soundEventCells = new HashMap<Double, List<SoundEvent>>(); 这HashMap会将double值(它们是时间点)映射到相应的SoundEvent“单元格”:每个“单元格”可以包含多个SoundEvent。这就是为什么将其实现为的原因List<SoundEvent>,因为这正是它的本质。 为了提高代码的可读性,我考虑过实现一个非常简单的静态内部类,如下所示: private static class SoundEventCell { private List<SoundEvent> soundEvents = new ArrayList<SoundEvent>(); public void addEvent(SoundEvent event){ soundEvents.add(event); } public int getSize(){ return soundEvents.size(); } public SoundEvent getEvent(int index){ return soundEvents.get(index); } // .. remove() method unneeded } 并且比地图声明(以及许多其他代码)看起来更好,例如: Map<Double, SoundEventCell> soundEventCells …

7
函数只返回不变的参数,没用吗?
我刚刚在我正在工作的项目中找到此功能: -- Just returns the text unchanged. -- Note: <text> may be nil, function must return nil in that case! function Widget:wtr(text) return text end 太可悲的是,编码器不再在公司工作。为什么要使一个函数什么都不做,但是返回调用它的参数呢? 这种功能有什么用,在本例中未指定,但在任何情况下都没有用? 由于 function aFunction(parameter) return parameter end 结束于 aFunction(parameter) == parameter 我为什么要写这样的东西 aFunction(parameter) == whatIWantToCheck 代替 parameter == whatIWantToCheck ?

1
Java应用程序结构:水平拆分与垂直拆分
对于大型Java应用程序的启动项目结构(使用Maven / Eclipse)有一些争论。 选项1: entities (i.e. the whole database using Hibernate classes-first) services (i.e. sets of read/write operations on the entities) app (perhaps split up more further down the line) 选项2: area1-entities area1-services area1-app area2-entities area2-services area2-app ... (where area1, area2 etc. are functional areas of the system) 选项2显然将导致产生更多的Maven项目/模块,这意味着将生成数据库的类分布在多个项目中。谁能建议每种方法的利弊?

3
我得到依赖注入,但是有人可以帮助我了解对IoC容器的需求吗?
如果这似乎又是一个重复的问题,我深表歉意,但是每次我找到有关该主题的文章时,它大多只是在谈论DI是什么。因此,我得到了DI,但我试图了解每个人似乎都在使用的IoC容器的需求。IoC容器的目的真的只是为了“自动解决”依赖项的具体实现吗?也许我的类往往没有几个依赖关系,也许这就是为什么我认为没什么大不了的,但是我想确保我正确地理解了容器的效用。 我通常将我的业务逻辑分解为一个可能看起来像这样的类: public class SomeBusinessOperation { private readonly IDataRepository _repository; public SomeBusinessOperation(IDataRespository repository = null) { _repository = repository ?? new ConcreteRepository(); } public SomeType Run(SomeRequestType request) { // do work... var results = _repository.GetThings(request); return results; } } 因此,它仅具有一个依赖性,在某些情况下可能具有第二或第三依赖性,但并非经常如此。因此,任何调用此方法的都可以传递其自己的存储库,也可以允许其使用默认存储库。 就我对IoC容器的当前了解而言,该容器所做的只是解析IDataRepository。但是,如果这就是全部,那么我就没有看到太多的价值,因为当没有依赖项传入时,我的操作类已经定义了一个回退。所以我唯一想到的另一个好处是,如果我有多个操作,例如这个使用相同的后备仓库,我可以在注册表/工厂/容器的一个地方更改该仓库。那太好了,是吗?

2
如果已经使用图形数据库,为什么还要使用ElasticSearch?
对于ElasticSearch和图数据库之间的比较,我在网络上找不到任何深入的解释。 两者均经过优化以遍历数据。 ElasticSearch似乎已针对分析进行了优化。 但是Neo4j也基于Lucene来管理索引和一些全文功能。 如果已经使用图形数据库,为什么还要使用ElasticSearch? 就我而言,我正在使用Neo4j建立社交网络。 ElasticSearch可以带来什么真正的好处? 更新---------- 我刚刚找到了这一段: 在无数情况下,elasticsearch是有用的。一些用例比其他用例更明确地要求它。下面列出了一些特别适合Elasticsearch的任务。 在大量产品说明中搜索特定词组(例如“厨师的刀”)的最佳匹配,并返回最佳结果 以前面的示例为例,分解出现“厨师的刀”的各个部门(请参阅本书后面的分面) 在文本中搜索听起来像“季节”的单词 在考虑到拼写错误的情况下,根据先前发布的搜索结果,根据部分键入的单词自动完成搜索框 以分布式方式存储大量的半结构化(JSON)数据,并在整个计算机集群中具有指定级别的冗余 但是,应该注意的是,尽管Elasticsearch在解决上述问题方面很出色,但对于其他人来说并不是最佳选择。解决关系数据库已优化的问题尤其困难。问题如下。 计算库存中剩余多少物品 计算给定月份发出的所有发票上所有行项目的总和 通过回滚支持以事务方式执行两个操作 创建保证在多个给定条件下唯一的记录,例如电话号码和分机号 Elasticsearch通常非常擅长提供数据的近似答案,例如按质量对结果进行评分。虽然Elasticsearch可以执行精确的匹配和统计计算,但其主要搜索任务是固有的近似任务。 查找近似答案是一种将Elasticsearch与更多传统数据库区分开的属性。话虽这么说,传统的关系数据库在精度和数据完整性方面都非常出色,而Elasticsearch和Lucene对此几乎没有规定。 我是否可以断言,如果我不需要近似答案,那么与已经使用的图形数据库相比,ElasticSearch会毫无用处吗?

1
套接字如何通过无线连接工作?
我只在使用Android的客户端(特别是移动)应用程序上工作,其中所有网络都是使用框架提供的组件(如HttpUrlConnection)在HTTP层进行处理的。 但是推送消息系统(如Websockets / XMPP等)都保持与服务器的持久连接。甚至包含在支持Google Play的设备中的Google GCM都可以保持与服务器的持久连接。 我的问题是,如何在不耗尽电池的情况下工作?如果我们依次发出连续的HTTP请求,则电池电量将大量消耗。如何在不遇到相同问题的情况下维持这些持久连接?

4
一流的功能是否可以代替战略模式?
该战略的设计模式通常被认为是在缺乏这些语言的一流功能的替代品。 例如,说您想将功能传递给对象。在Java中,您必须向该对象传递另一个封装了所需行为的对象。在诸如Ruby之类的语言中,您只是以匿名函数的形式传递功能本身。 但是我在考虑它,因此决定也许Strategy提供的功能比普通的匿名功能还多。 这是因为对象可以保持独立于其方法运行时间的状态。但是,匿名函数本身只能保持在函数完成执行后就不复存在的状态。 在支持一流功能的面向对象语言中,策略模式相对于使用功能是否有任何优势?

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.