谈谈面试经历

  具体原因不在论述,相信我,不是随便挪窝的人,说简单点,比如你才入职,结果第四个月才拿到第一份工资,这都不算,再说说,离职的时候,还打了三个月工资的白条给你,你会怎么想?

说正题:

1、面向对象的几个原则:

 1). 单一职责原则(SRP)

单一职责原则的核心思想:系统中的每一个对象都应该只有一个单独的职责,而所有对象关注的就是自身职责的完成。它的英文缩写是SRP,英文全称是 Simple Responsibility Principle。

单一职责:开发人员经常说的“高内聚,低耦合”。也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。在设计模式中,所有的设计模式都遵循这一原则。

 2). 开闭原则(OCP)

开闭原则的核心思想:一个对象对扩展开放,对修改关闭。他的英文缩写是OCP, 英文全称是 Open for Extension, Closed for Modification 。

开闭原则: 对类的改动是通过增加代码进行的,而不是改动现有的代码。也就是说,软件开发人员一旦写出了可以运行的代码,就不应该去改变它,而是要保证它能一直运行下去,如何才能做到这一点呢?这就需要借助抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现层则是可以改变和扩展的。

 3). 里氏替换原则(LSP)

里氏替换原则的核心思想:在任何父类出现的地方都可以用它的子类来替代。它的英文缩写是LSP, 英文全称是 Liskov Substitution Principle 。

里氏替换:同一个继承体系中的对象应该有共同的行为特征。里氏替换原则关注的是怎样良好地使用继承,也就是说不要滥用继承,它是继承复用的基石。

 4). 依赖注入原则(DIP)

依赖注入原则的核心思想:要依赖于抽象,不要依赖于具体的实现。它的英文缩写是DIP, 英文全称是 Dependence Inversion Principle 。

依赖注入原则:在应用程序中,所有的类如果使用或依赖于其他的类,则都应该依赖于这些其他类的抽象类,而不是这些其他类的具体实现类。抽象层次应该不依赖于具体的实现细节,这样才能保证系统的可复用性和可维护性。为了实现这一原则,就要求开发人员在编程时要针对接口编程,而不是针对实现编程。

 5). 接口分离原则(ISP)

接口分离原则的核心思想:不应该强迫客户程序依赖它们不需要使用的方法。它的英文缩写是ISP, 英文全称是 Interface Segregation Principle 。

接口分离:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口当中。

 6). 迪米特原则(LOD)

迪米特原则的核心思想:一个对象应当对其他对象尽可能少的了解。它的英文缩写是LOD,英文全称是 Law of Demeter 。

迪米特原则:降低各个对象之间的耦合,提高系统的可维护性。在模块之间应该只通过接口来通信,而不理会模块的内部工作原理,他可以使各个模块耦合程度降低到最低,促进软件的复用。

 7). 优先使用组合而不是继承原则(CARP)

优先使用组合而不是继承原则的核心思想:优先使用组合,而不是继承。它的英文缩写是CARP,英文全称是 Composite / Aggregate Reuse Principle 。

优先使用组合而不是继承原则:在复用对象的时候,要优先考虑使用组合,而不是继承,这是因为在使用继承时,父类的任何改变都可能影响子类的行为,而在使用组合时,是通过获得对其他对象的引用而在运行时刻动态定义的,有助于保持每个类的单一职责原则。

2、数据性能优化

 1).对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

 2).应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。如char类型的自从建立之初就占据了部分内存,类似int类型的最好采用默认值。

 3).应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

 4).应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以尝试采用UNION ALL

 5).如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如select id from t where num = @num 可以考虑改为select id from t with(index(索引名)) where num = @num。

 6).应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如substring的时候,可以考虑使用like。

 7).Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。

 8).对于多张大数据量的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。

 9).索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。

 10).避免频繁创建和删除临时表,以减少系统表资源的消耗。临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

 11).如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

 12).尽量避免使用游标,因为游标的效率较差,主要是因为游标是按行处理的,游标返回的记录越多,性能越低。

 13).对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。

 14).在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

 15).尽量避免大事务操作,提高系统并发能力。

 16).减少应用和数据库的交互次数、同一个sql语句的执行次数。

 17).减少表之间的关联,特别对于批量数据处理,尽量单表查询数据,统一在内存中进行逻辑处理,减少数据库压力。

 18).对访问频繁的数据,充分利用数据库cache和应用的缓存。

 19).数据量比较大的,在设计过程中,为了减少其他表的关联,增加一些冗余字段,提高查询性能。

 20).读写分离。集群等等。可怜的我到现在就试验过读写分离、数据库订阅。

3、反射的弊端

 对于这个,我面试的时候真心就除了性能,其他的没有想到,不过还是感谢万能的园友。

 1).编译通过,运行时出错的问题,如果用的地方多了,不好排错。

 2).使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

 3).使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。

 4、对于.net的前景,你怎么看?

 我面试的公司,至少有60%都问到了这个问题,让我有点郁闷呀,我的回答就是微软不倒闭,我们怕撒子。

 其他的问题,诸如WCF、WebService、WebAPI、MVC之类的,还有面试过程中,用过什么组件之类的,反正就是你写到的,面试官都会问问,通过面试,自己还是太菜,对于比较公众的问题,这里写一个简单的,希望大神不要喷。

  顺便吐槽一下某些大公司,我操,第五轮面试了,你让我到底等还是不等?

原文地址:https://www.cnblogs.com/JeffController/p/5257507.html