Skip to content

Latest commit

 

History

History
214 lines (125 loc) · 14.7 KB

File metadata and controls

214 lines (125 loc) · 14.7 KB

十四、自己做好准备——面试和未来

这是《面向对象编程》一书中不同寻常的一章。求职面试是软件开发人员职业生涯的重要组成部分。面试就像是对你知识的考验。它让你知道你知道多少,你应该了解更多。这也是向其他公司有经验的开发人员学习的一种方式。

这一章的主要目的是让你一瞥求职面试中问的问题类型,以及你如何为这些问题做好准备。请记住,面试问题取决于你申请的职位、公司、面试官的知识以及公司正在使用的技术堆栈。虽然不是所有这些问题都会被问到,但是很有可能有些问题会被问到,因为这些问题决定了你的基本面向对象和 C# 知识。

让我们回顾一下本章将涉及的主题:

  • 面试问题
  • 面试和职业提示
  • 接下来要学的东西
  • 阅读的重要性

面试问题

在本节中,我们将讨论一些最常见的初级到中级开发人员的面试问题。因为这本书是关于 C# 的,所以我们也会有与 C# 编程语言直接相关的问题。

面向对象编程的基本原理是什么?

面向对象编程有四个基本原则:

  • 遗产
  • 包装
  • 抽象
  • 多态性

什么是继承?

继承是指一个类可以继承另一个类的属性和方法。比如Dog是类,但也是Animal的子类。一个Animal类是一个更一般的类,具有所有动物都有的基本属性和方法。由于狗也是动物,一个Dog类可以继承Animal类,这样Animal类的所有属性和方法也可以在Dog类中获得。

什么是封装?

封装就是隐藏一个类的数据。C# 中的访问修饰符主要用于封装的目的。如果我们将一个方法或字段设为私有,那么该方法或字段在类之外是不可访问的。这意味着我们对外界隐藏了这些数据。拥有封装的主要原因是我们希望隐藏更复杂的实现,并且只向外部世界显示简单的接口以便于使用。

什么是抽象?

抽象是一种想法,一种不真实的东西。抽象是指向外界提供某个对象的概念,但不是它的实现。接口和抽象类是抽象的例子。当我们创建一个接口时,我们不在其中实现方法,但是当一个类实现接口时,它也必须实现方法。这意味着接口实际上是给类一个抽象的印象。

什么是多态性?

多态性意味着多种形式。在 OOP 中,我们应该可以选择以多种形式创建一个东西。例如,您可以有一个addition方法,它可能有不同的实现,这取决于它接收的输入。接收两个整数并返回这些整数之和的addition方法可以是一个实现。还有另一种形式的addition方法,它可以取两个双精度值,并返回这两个双精度值的总和。

什么是接口?

接口是 C# 编程语言的一个实体或特性,用于在程序中应用抽象。这就像一个类和接口本身之间的契约。约定是继承接口的类必须实现接口自身所具有的方法签名。接口不能被实例化,它只能由类或结构实现。

什么是抽象类?

一个抽象类是一种特殊的不能初始化的类。不能从抽象类创建任何对象。抽象类可以有具体的方法,也可以有非具体的方法。如果一个类实现一个抽象类,该类必须实现抽象方法。如果需要,它可以重写非抽象方法。

什么是密封类?

A 密封类是不能继承的类。主要用于停止 C# 中的继承特性。

什么是分部类?

一个分部类是一个在单独文件中有其来源的类。通常,一个类的所有字段和方法都在同一个文件中。在分部类中,您可以将不同文件中的类代码分开。编译时,独立文件中的所有代码都被视为一个类。

接口和抽象类有什么区别?

以下是接口和抽象类之间的主要区别:

  • 一个类可以实现任意数量的接口,但只能实现一个抽象类。
  • 抽象类可以有抽象方法,也可以有非抽象方法,而接口不能有非抽象方法。
  • 在抽象类中,默认情况下数据成员是私有的,而在接口中,所有数据成员都是公共的,这是不能更改的。
  • 在抽象类中,我们需要使用abstract关键字来使方法抽象,而在接口中不需要这样做。

方法重载和方法重写有什么区别?

方法重载是指同名方法的输入参数不同。例如,假设我们有一个名为Sum的方法,它接受两个整数类型的输入并返回一个整数类型的输出。Sum的重载方法可以接受两个双类型输入并返回一个双输出。

方法覆盖是在子类中为不同类型的实现实现具有相同名称、相同参数和相同返回类型的方法。例如,假设我们在一个名为Sales的类中有一个名为Discount的方法,其中折扣计算为总购买量的 2%。如果我们有另一个名为NewYearSalesSales子类,其中折扣计算为 5%,使用方法覆盖,NewYearSales类可以轻松应用新的实现。

什么是访问修饰符?

访问修饰符用于设置编程语言中不同实体的安全级别。通过设置访问修饰符,我们可以隐藏不同级别的类的数据。

在 C# 中,有六种类型的访问修饰符:

  • 公众
  • 私人的
  • 保护
  • 内部的
  • 受保护的内部
  • 私有受保护

什么是装箱拆箱?

装箱是将值类型转换为对象的过程。取消装箱是从对象中提取值类型。装箱可以隐式完成,但是拆箱必须在代码中显式完成。

结构和类之间有什么区别?

结构和类是非常相似的概念,但有些不同:

  • 结构属于值类型,类属于引用类型。
  • 结构通常用于少量数据,而类用于大量数据。
  • 结构不能被其他类型继承,而类可以被其他类继承。
  • 结构不能是抽象的,而类可以是抽象的。

C# 中的扩展方法是什么,我们如何使用?

扩展方法是一种添加到现有类型而不创建新的派生类型或编译或更改现有类型的方法。它就像一个扩展。例如,默认情况下,我们从.NET 框架。如果我们想向这个字符串类型添加另一个方法,要么我们必须创建一个派生类型来扩展这个字符串类型并将方法放在那里,要么我们将代码添加到.NET 框架并编译和重建库。但是,使用扩展方法,我们可以很容易地扩展现有类型的方法。为此,我们必须创建一个静态类,然后创建一个静态的扩展方法。这个方法应该以类型作为参数,但是this关键字应该放在字符串之前。现在这个方法将作为该类型的扩展方法。

什么是托管和非托管代码?

中开发的代码.NET 框架称为托管代码。公共语言运行时 ( CLR )可以直接执行这段代码。非托管代码不是在.NET 框架。

C# 中的虚方法是什么?

一个虚拟方法是一个在基类中实现的方法,但是也可以在子类中被覆盖。虚拟方法不能是抽象的、静态的、私有的或重写的。

你对 C# 中值类型和引用类型的理解是什么?NET?

在 C# 中,有两种类型的数据。一种叫做值类型,另一种叫做引用类型。值类型是将值直接保存在内存位置的类型。如果复制该值,新的内存位置将保存相同的值,并且两者相互独立。一个参考类型是当值没有直接放在内存位置,而是设置了一个值的参考。值类型和引用类型的另一个主要区别是值类型位于堆栈中,而引用类型位于堆中。值类型的例子是int,而引用类型的例子是string

什么是设计原则?

组成首字母缩略词 SOLID 的设计原则有五条:

  • 单一责任原则
  • 开放/封闭原则
  • 利斯科夫替代原则
  • 界面分离原理
  • 依赖倒置原则

什么是单一责任原则?

"A class should have one, only one reason to change."

——罗伯特 c .马丁

这意味着一个班级应该只有一个责任。如果一个班级做多件事,这就违反了单一责任原则 ( SRP )。例如,如果我们有一个名为Student的班级,它应该只负责学生相关的数据。如果在更改Teacher类中的任何内容时需要修改Student类,则Student类违反了 SRP。

什么是开/闭原理?

软件组件应该对扩展开放,但对修改关闭。这意味着组件的设计方式应该是,如果需要添加新的规则或功能,就不需要修改现有的代码。如果您必须修改现有代码来添加新功能,这意味着组件违反了打开/关闭原则

什么是利斯科夫替代原则?

派生类型必须完全可以替代它们的基类型。这意味着,如果您在某个地方使用了基类的实例,您应该能够用该基类的子类实例替换基类实例。例如,如果您有一个名为Animal的基类和一个名为Dog的子类,您应该能够用Dog类实例替换您的Animal类实例,而不会破坏任何功能。

什么是界面隔离原理?

不应该强迫客户依赖他们不使用的接口。有时,接口包含许多可能不会被实现它们的类使用的信息。界面隔离原则建议保持界面小。类应该实现多个小接口,而不是实现一个大接口,因为类中的所有方法都是需要的。

依赖倒置原理是什么?

高级模块不应该依赖低级模块;两者都应该依赖于抽象。这意味着,当您开发模块化软件代码时,高级模块不应该直接依赖于低级模块,而应该依赖于低级模块已经实现的接口或抽象类。通过这样做,系统中的模块是独立的,并且在将来,如果您用另一个模块替换您的低级模块,高级模块不会受到影响。

这个原则还有一部分,就是抽象不要依赖细节,细节要依赖抽象。这意味着接口或抽象类不应该依赖于类,但是实现接口和抽象类的类应该依赖于接口或抽象类。

面试和职业提示

既然我们已经讨论了一些在面试中最常见的问题,我也有一些建议可以帮助你在面试和职业生涯中表现得更好。

提高你的沟通技巧

人们普遍认为软件开发人员不合群,不善于沟通。然而,现实却大不相同。所有成功的开发者都有善于沟通。

作为一名软件开发人员,有时你必须向非技术人员解释技术观点或情况。为了做到这一点,你必须以这样一种方式进行交流,使每个人都能获得和理解信息。这可能包括口头(会议或讨论)和书面沟通(文件或电子邮件)。

在你职业生涯的开始,你可能不一定理解沟通的重要性,因为你只是被赋予要完成的任务。然而,当你获得经验并在职业生涯中取得成功时,你会意识到有效沟通的重要性。

作为一名高级开发人员,您可能必须与初级开发人员沟通,解释问题或解决方案,或者与业务团队沟通,以确保您完全理解业务需求。您可能还需要为知识共享目的举办技术会议。

因此,确保你与他人保持互动,并阅读有助于你有效沟通的资源,并教你如何向听众讲话。良好的沟通技巧不仅会帮助你在面试中胜出,而且在你的整个职业生涯中对你都很有价值。

继续练习

虽然没有一个软件开发人员是完美的,但通过定期练习,你可以成为一个知识渊博、经验丰富的软件开发人员。

计算机编程是一门艺术。通过犯错,你会培养出什么是错的,什么是对的意识。代码越多,经历的不同情况就越多。这些情况将帮助你获得经验,因为你可能会在未来的项目中再次遇到它们。

而学习或掌握编程最好的方法就是练习

试着将你在这本书中学到的概念应用到你的实际项目中。如果在您当前的项目中这是不可能的,请创建演示项目并在那里应用它们。技术概念非常实用;如果你正在做实际的实现,概念会变得非常清晰。

接下来要学的东西

读完这本书,你应该对 OOP 和 C# 编程语言有了更好的理解。然而,这还不够。你必须督促自己学习更多关于软件开发的知识。您应该学习 C# 的其他语言特性,以及如何使用它们来完成您的工作。你还应该为你的专业工作学习数据结构和算法。在下面的列表中,我提出了一些接下来要研究的主题和技术:

  • C# 编程语言功能,如运算符、控制语句、数组、列表、运算符重载、Lambda 表达式、LINQ、字符串格式和线程
  • 数据结构和算法,如链表、二叉树、排序和搜索算法。
  • 网络/桌面框架,如 ASP.NET MVC、ASP.NET 网络应用编程接口、WPF 和 WCF
  • 前端技术,如 HTML、CSS 和 Javascript,以及 JavaScript 框架,如 reactjs/angular
  • 数据库技术,如微软的 SQL Server、甲骨文和 MySQL
  • 设计模式及其含义
  • 软件架构和设计
  • 干净的代码、代码重构和代码优化

还有很多其他东西需要学习,但是我已经涵盖了我相信每个软件开发人员都应该知道的主题。这个列表很长,题目也很专业,所以要仔细规划你的学习。

养成阅读的习惯

我的最后一个建议是成为一个狂热的读者。阅读对软件开发人员来说非常重要。信息通常是通过文本或语音分发给人们的。虽然视频教程是一种很好的学习方式,但阅读给了你思考的时间,并为你提供了访问数百万资源的途径。

以下是我必读的几本书:

  • 《务实的程序员:从熟练工到大师》安德鲁·亨特和戴维·托马斯著
  • 罗伯特·塞西尔·马丁的干净代码
  • 史蒂夫·麦康奈尔代码完成 2
  • 马丁·福勒和肯特·贝克的《重构》
  • 查尔斯·e·雷瑟森、克利福德·斯坦、罗纳德·瑞文斯特和托马斯·h·科曼的《算法导论》
  • 设计模式:可重用面向对象软件的元素由“四人帮”提出
  • 简而言之,C# 7.0:约瑟夫·阿尔巴哈里的权威参考
  • C# 深度乔恩·斯基特

摘要

软件开发是一个非常有趣的领域。你可以开发出改变世界的神奇应用。脸书和地图等应用,以及谷歌和视窗等数字巨头的无数产品,对我们的生活产生了重大影响。程序可以通过提高生产力使人们的生活变得更容易。

作为一名软件开发人员,我对你的要求是写好代码,开发出令人惊叹的应用。如果你有正确的意图、对软件开发的热情和强烈的职业道德,你一定会在事业上取得成功。

让我们通过创造能够帮助人类文明进步的神奇软件,让这个世界变得伟大。