zoukankan      html  css  js  c++  java
  • 谈谈面试经历

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

    说正题:

    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之类的,还有面试过程中,用过什么组件之类的,反正就是你写到的,面试官都会问问,通过面试,自己还是太菜,对于比较公众的问题,这里写一个简单的,希望大神不要喷。

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

  • 相关阅读:
    关于闭包的一些知识
    浏览器解析JavaScript原理(1)
    函数作用域及函数表达式
    jquery
    前端常用插件
    Git及GitHub
    angular框架
    express
    ES6基础
    Node.js相关总结
  • 原文地址:https://www.cnblogs.com/JeffController/p/5257507.html
Copyright © 2011-2022 走看看