软件工程

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

10
达到中间编程状态
我是一名软件工程师,曾在VBA中担任过职位编程(尽管我不敢考虑那种“真实的”经验,因为那是反复试验!),带有CGI,Perl的CGI,C#和ASP.NET。后两个是本科生,我进入了“现实世界”。我大学毕业了2年,并且在我提到的所有语言上有5年(总计)的经验。但是,谈到我的简历,我只能将C#放下两年,而将ASP.NET放下不到一年。 我觉得我知道 C#,但是我仍然必须花时间去研究“此方法的作用是什么?”,而一些更高级的工程师可以立即说:“哦,方法X可以做到这一点,而无需考虑它方法之前。” 因此,我凭经验知道那里有一个鸿沟,但我不确定如何弥合它。我已经开始在Euler项目中进行编程,并且读了一本关于设计模式的书,但是我仍然觉得我每天都在花很多时间而不是继续前进。 这并不是说我没有进步的感觉,这只是意味着,就我每天来而言,我仍然可以看到远处的山顶。 我的问题是:您如何克服这个高原?你花了多长时间?您可以建议采用什么方法来协助我? 我已经阅读了《 Code Complete》,《The Manthical Man Month》和《CLR》第二版的CLR,我的问题是:我现在该怎么办? 编辑:我刚刚在中级程序员的项目中发现了这个问题。我认为这增加了讨论的范围(尽管并不能取代我的问题)。因此,我将其添加到问题中作为“更多信息”。


1
为什么将插入号用于XOR而不是求幂?
对于以前曾经遇到过此语法问题的任何人来说,这并不是一个真正的问题,但是我看到使用插入号(^)作为XOR运算代替了广泛接受的数学幂运算而引起的大量混乱。 当然,在很多地方都可以解释和纠正插入符号的(误用)用法,但是对于插入符号为何具有不同的含义,我没有找到任何明确的资料。 是为了方便吗?一次意外?显然,各种语言的推理可能会有所不同,因此任何方面的信息都将很有见地。

10
使用GUID作为主键
我通常在数据库中使用自动增量ID作为主键。我正在尝试学习使用GUID的好处。我已经阅读了这篇文章:https : //betterexplained.com/articles/the-quick-guide-to-guids/ 我意识到这些GUID用于在应用程序级别识别对象。它们是否也作为主键存储在数据库级别。例如,假设我有以下课程: public class Person { public GUID ID; public string Name; .. //Person Methods follow } 假设我想在内存中创建一个新人员,然后将其插入数据库。我可以这样做吗? Person p1 = new Person(); p1.ID=GUID.NewGUID(); PersonRepository.Insert(p1); 假设我有一个包含数百万行的数据库,其中GUID作为主键。这将永远是独一无二的吗?我什至正确理解了GUID吗? 我之前读过这篇文章:http : //enterprisecraftsmanship.com/2014/11/15/cqs-with-database-generation-ids/。它似乎使我感到困惑,因为它似乎建议在GUID和整数之间作为主键使用快乐的介质。 编辑11/06/18 我已经相信Guid比int更适合我的要求。这些天来,我使用CQRS的次数更多,而GUID则更适合。 我确实注意到一些开发人员在域模型中将GUID建模为字符串,例如:https : //github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/Services/Ordering/Ordering.Domain/AggregatesModel/BuyerAggregate/ Buyer.cs-在这种情况下:IdentityGuid是一个建模为字符串的GUID。除了此处说明的内容外,是否还有其他理由:在分布式系统中使用自定义值对象或Guid作为实体标识符?。将GUID建模为字符串是“正常的”还是应该在模型和数据库中将其建模为GUID?

5
允许内部向量的迭代而不会泄漏实现
我有一堂课代表一个人的名单。 class AddressBook { public: AddressBook(); private: std::vector<People> people; } 我想允许客户遍历人脉。我首先想到的只是: std::vector<People> & getPeople { return people; } 但是,我不想将实现细节泄漏给客户端。修改向量时,我可能想保留某些不变式,而当我泄漏实现时,我将失去对这些不变式的控制。 允许迭代而不泄漏内部的最佳方法是什么?
32 c++ 

3
如何在公共API中表示(枚举)类型
我正在开发一个简单的API,我想将其用于自己的客户端,并在将来向公众开放。我有可以具有不同“类型”的“项目”对象。目前,该类型是C“ typedef枚举”: typedef enum { ItemTypeBool, ItemTypeNumber, ItemTypeDate, } ItemType; (我将来可能会添加一些) 我想知道我是否应该将其转换为整数或定义的“字符串”。JSON为: 对于整数: { "name": "The name", "type": 0, ... } 对于字符串: { "name": "The name" "type": "boolean" ... } 我想知道是否有最佳实践。保留整数将稍微简化代码并减少带宽,但是字符串对于开发人员来说更容易记住。我记得我在一个项目上工作,我必须记住1 =图像,2 =音频,3 = html等。。。这没有任何实际意义。 所以我问你,如果你知道我应该考虑的其他方面。

2
选择正确的设计模式
我一直都认识到利用设计模式的重要性。我对其他开发人员如何选择最合适的开发人员感到好奇。您是否使用一系列特征(例如流程图)来帮助您做出决定? 例如: 如果对象是相关的,但是我们不想指定具体的类,请考虑Abstract 将实例化留给派生类时,请考虑使用Factory 需要顺序访问聚合对象的元素,请尝试使用Iterator 或类似的东西?

6
Spring应当自动装配哪些类(何时使用依赖注入)?
我已经在Spring中使用Dependency Injection已有一段时间了,我了解它的工作原理以及使用它的优缺点。但是,当我创建一个新类时,我常常想知道-该类是否应该由Spring IOC Container管理? 而且我不想谈论@Autowired注释,XML配置,setter注入,构造函数注入等之间的区别。我的问题是一个普遍的问题。 假设我们有一个带有Converter的服务: @Service public class Service { @Autowired private Repository repository; @Autowired private Converter converter; public List<CarDto> getAllCars() { List<Car> cars = repository.findAll(); return converter.mapToDto(cars); } } @Component public class Converter { public CarDto mapToDto(List<Car> cars) { return new ArrayList<CarDto>(); // do the mapping here } …

5
为什么C#和Java使用引用相等作为'=='的默认值?
我已经思考了一段时间,为什么Java和C#(我敢肯定其他语言)默认引用相等==。 在我做的编程中(当然,这只是编程问题的一小部分),在比较对象而不是引用相等时,我几乎总是想要逻辑相等。我试图思考为什么这两种语言都走这条路线而不是颠倒它,并具有==逻辑上的相等性,并.ReferenceEquals()用于引用相等性。 显然,使用引用相等很容易实现,并且行为非常一致,但是似乎并不适合我今天看到的大多数编程实践。 我不想对尝试实现逻辑比较的问题一无所知,并且必须在每个类中都实现它。我也意识到这些语言是很久以前设计的,但总的问题仍然存在。 默认情况下,我只是缺少一些主要好处,还是默认行为应该是逻辑相等,并且默认返回引用相等,而该类不存在逻辑相等似乎合理吗?



4
抽象数据类型和数据结构
我很难理解这些术语。我在Google上搜索并在Wikipedia上阅读了一些内容,但我仍然不确定。到目前为止,我已经确定: 抽象数据类型是新类型的定义,描述了其属性和操作。 数据结构是ADT的实现。许多ADT可以实现为相同的数据结构。 如果我认为正确的话,数组作为ADT意味着元素的集合以及作为数据结构的方式,即如何将其存储在内存中。堆栈是具有推入,弹出操作的ADT,但是如果我的意思是我在算法中使用了以数组形式实现的堆栈,那么我们可以说一下堆栈数据结构吗?为什么堆不是ADT?它可以实现为树或数组。

7
函数编程与带类的OOP相比
最近,我对函数式编程的某些概念感兴趣。我已经使用OOP一段时间了。我可以看到如何在OOP中构建一个相当复杂的应用程序。每个对象都会知道该对象执行的操作。还是父母班上的任何事情都可以。因此,我可以简单地告诉Person().speak()别人说话。 但是如何在函数式编程中做类似的事情?我看到函数是头等舱物品。但是该功能只做一件事。我是否可以简单地使用一个say()浮动的方法,并使用等效的Person()参数来调用它,以便使我知道在说些什么呢? 因此,我可以看到简单的事情,在函数式编程中,我将如何做OOP和对象的比较,从而可以模块化和组织代码库? 作为参考,我对OOP的主要经验是Python,PHP和一些C#。我正在查看的具有功能特性的语言是Scala和Haskell。虽然我倾向于Scala。 基本示例(Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: {0}'.format(what)) Cat(Animal): def say(self, what): super().say('cat meows: {0}'.format(what)) dog = Dog() cat = Cat() dog.say('ruff') cat.say('purr')

9
何时重构
我已经阅读了Fowler的Refactoring一书中的大部分内容,并且在过去的大大小小中都重构了许多应用程序。 我发现很难教的一件事是“何时”重构。我倾向于基于过去对我非常有益的直觉。但是,在与人们讨论是应该立即保留一段代码还是现在重构代码时,很难忍受“胆量检查”。 我觉得应该有更严格的方法来解决这个问题,但是不确定它们是什么。 我了解“代码嗅觉”,红色-绿色重构和其他想法,但是我常常觉得,重构的最佳时间不是第一次编写代码,而是第二次或第三次使用代码并意识到这实际上是一个问题,正在实际使用中。

8
对变量使用较小的数据类型以节省内存是一种好习惯吗?
当我第一次学习C ++语言时,我了解到除了int,float等之外,这些数据类型还存在着较小或较大的版本。例如我可以称一个变量x int x; or short int x; 主要区别在于short int占用2个字节的内存,而int占用4个字节,而short int的值较小,但是我们也可以调用它来使其更小: int x; short int x; unsigned short int x; 更加严格。 我的问题是,根据变量在程序中采用的值,使用单独的数据类型是否是一个好习惯。始终根据这些数据类型声明变量是一个好主意吗?

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.