您的位置:首页 > 职场人生

面试杂谈,题目记录

2013-03-27 12:40 316 查看
昨天面试了一天,笔试后hr面试,然后再面试,然后再机试,然后技术面试。虽然最后被pass掉了,但是这次面试还是受益匪浅的。

没有什么面试经验,能有次这样的面试,虽然结果令人沮丧的想诅咒人,但是过程还是值得玩味。现在记录一下昨天没有回答出来的面试题,当做是一种积累吧。

1:property和attribute的区别

attribute属于OOA/OOD的概念,而property属于编程语言中的概念。

在OOA/OOD中的使用Attribute表示属性,指对象(Object)的特征(Feature)。我们 在一些编程语言(如C#、Delhpi等)中遇到的“属性”一词。

下面我们来说明它们的异同。

Attribute
Attributes是Microsoft .NETFramework文件的元数据,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

Property
属性是面向对象编程的基本概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。

2:Socket 与 Webservice 的通信区别

socket是一种协议,采用tcp或udp协议通信。

Tcp、udp属于网络层,上边各层的应用都需要我们自己实现,例如端口的定义,数据包的定义,数据包的加密解密等。

webservice是一种服务,采用HTTP协议通信,Soap作为数据格式。

HTTP协议属于应用层,通过服务器才可以发布,这样内部定义的端口,数据包,加解密都做好了,可以直接使用。

webservice基于HTTP协议,因此可以利用现有非常成熟的Web集群来提供高负载,同比之下 socket就非常难。

网络七层协议从低到高:

1、物理层(Physical Layer)、

2、数据链路层(Data Link Layer)、

3、网络层(Network Layer)、

4、传输层(Transport Layer)、

5、会话层(Session Layer)、

6、表示层(Presentation Layer)、

7、应用层(Application Layer)

webservice一般分为http webservice ,soap webservice两种,都是基于http通信协议的,一般返回xml格式的数据,所以也可以叫做xml webservice.

http webservice 通过get post 两种方法来调用远程的数据服务,适合简单参数的传递(get 直接在url里带上参数);soap webservice通过soap协议传输数据,soap是基于xml标准的,也是就说可以用xml结构的数据来传输参数,这样参数类型可以很复杂,处理远程返回的xml数据时也更方便.

其实soap协议也是基于http协议的.

webservice离不开web服务器(apache),web服务器是一个在公网上提供http通信的服务器.webservice 一般都建立在web服务器上,以供别人调用.

socket 是基于传输层的,http基于应用层,socket是一切通过端口通信的基础(包括http),http://baike.baidu.com/view/13870.htm

使用中,http常用于b/s通信,如web服务器就是用http做传输协议的,socket用于c/s(还有现在的富客户端),应用服务器中常用.socket穿防火墙有问题,而http几乎可以穿过任何防火墙(屏80的不多吧),socket通信的即时性比http好.

3:利用反射DataSet转换成List 泛型

/// <summary>
/// DataSet装换为泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="p_DataSet">DataSet</param>
/// <param name="p_TableIndex">待转换数据表索引</param>
/// <returns></returns>
/// 2008-08-01 22:46 HPDV2806
public static IList<T> DataSetToIList<T>(DataSet p_DataSet, int p_TableIndex)
{
if (p_DataSet == null || p_DataSet.Tables.Count < 0)
return null;
if (p_TableIndex > p_DataSet.Tables.Count - 1)
return null;
if (p_TableIndex < 0)
p_TableIndex = 0;
DataTable p_Data = p_DataSet.Tables[p_TableIndex];
// 返回值初始化
IList<T> result = new List<T>();
for (int j = 0; j < p_Data.Rows.Count; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] propertys = _t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
for (int i = 0; i < p_Data.Columns.Count; i++)
{
// 属性与字段名称一致的进行赋值
if (pi.Name.Equals(p_Data.Columns[i].ColumnName))
{
// 数据库NULL值单独处理
if (p_Data.Rows[j][i] != DBNull.Value)
pi.SetValue(_t, p_Data.Rows[j][i], null);
else
pi.SetValue(_t, null, null);
break;
}
}
}
result.Add(_t);
}
return result;
}
/// <summary>
/// DataSet装换为泛型集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="p_DataSet">DataSet</param>
/// <param name="p_TableName">待转换数据表名称</param>
/// <returns></returns>
/// 2008-08-01 22:47 HPDV2806
public static IList<T> DataSetToIList<T>(DataSet p_DataSet, string p_TableName)
{
int _TableIndex = 0;
if (p_DataSet == null || p_DataSet.Tables.Count < 0)
return null;
if (string.IsNullOrEmpty(p_TableName))
return null;
for (int i = 0; i < p_DataSet.Tables.Count; i++)
{
// 获取Table名称在Tables集合中的索引值
if (p_DataSet.Tables[i].TableName.Equals(p_TableName))
{
_TableIndex = i;
break;
}
}
return DataSetToIList<T>(p_DataSet, _TableIndex);
}


4:简述 private、 protected、 public、 internal 修饰符的访问权限

这一题是公司拿来面试别人的题目,结果这次自己面试居然没写对


private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。


5:visibility: hidden和display: none 有什么不同?

这一题答对了,但是还是放在这个记录里面吧

visibility: hidden----将元素隐藏,但是在网页中该占的位置还是占着。
display: none----将元素的显示设为无,即在网页中不占任何的位置。


6:简述装饰模式

最近刚好在看设计模式结果装饰模式还没看到,这次面试居然被问到了,杯具

这个问题先保留着,等设计模式看完写个笔记好了

7:同一个用户组里面不同的用户登录到后台权限不一样怎么设计

这种权限没弄过,接触的都是同一个用户组权限一样的情况,后来在群里聊讨论结果如下

先说说几种权限管理方案

一,简单session控制

实现原理和方法:

用户登录后台,输入用户名和密码,对用户的用户名和密码进行验证,验证通过后,可以把用户的一些基本信息放到session里面当用户访问后台的其他页面时,去判断一下session是否存在,并且没有过期。不过,后台管理员权限一样,没有区分
1,后台页面共用的基本类,我们可以在基本类的里加以判断,或者在基本类外面在extends一层,加以判断,去check一下session。
2,直接重写一个check_login.php每个后台页面都包涵这个页面,通过这个页面加以判断,check一下session。
二,菜单控制

自己系统里面就是三级菜单控制

实现原理和方法:
菜单控制比简单session控制要高级一点,不光判断用户是否登录,还对用户的权限进行了控制,不同的人看到不同的东西。
1,在显示菜单的地方加以判断,不同的用户显示不同的菜单。这种方法用户虽然看不到菜单,但是可以通过输入url,进入没有显示的菜单页面,前提是用户用户知道url才行。
2,建立一个用户和菜单内容的关系表,把用户所能看到的内容,放到数据库内,当要显示菜单的地方,用数据库进行读取,如果用户是通过输入url进入的话,我们也可以根据用户和url,到关系表中进行查找,如果没有找到的话,就不准许进入,这种方法可以避免上面一种方法的弊端了。
三,页面元素控制

上面说的菜单控制,可以设置权限到页面的级别,但是如果我有这样的需求又怎么办呢,所有的人都可以访问一个页面,一部分可以进行添加操作,一部分人可以进行删除操作,一部分可以进行审核工作。这样的需求,菜单控制很难实现的。现在的权限管理中好多都用的这种方式。例如:一些开源的论坛,cms系统。个人想了一个方法,觉得可以实现页面元素控制。看一下下面的图片。



解释一下:
A表,成员组表。这个表里面存的是一个一个组,财务组,开发组,发货组,定单审核组,退货组等。

B表,成员表。这个表里面存的是一个一个成员,张三,财务组。李四,开发组,王五,发货组,王五定单审核组。

C表,元素权限表。这个表里面存的是一个一个虚拟的权限。比如浏览权限,财务查看权限,发货权限,定单审核权限等。

D表,类别和元素权限的关系表,或者是页面和元素权限的关系表。也就是说,一个类别拥有什么权限,或者某个页面拥有什么权限。

E表,是成员组表和D表的关系表。表示这个成员组拥有那些权限,成员组拥有什么权限,表成成员也拥有什么权限。
为了表达清楚我的意思,我把这一套,分成了5张表,可以精减一下,去掉一到二张表。
实现原理和方法:
页面元素控制可以说是菜单控制的更进一步,更细一点了。对页面里面的具体操作也进行了控制。实现原理和菜单控制差不多。
1,和菜单管理一样,在显示菜单的地方,根据用户所在组进行显示。例如:张三,财务组,他进去看能看到财务的菜单,这个菜单下面也许会有很多页面,每个页面会有很多操作,查看一下E表,表找一下这个组能操作的类或者页面。我把这个方法叫做提前做法,就是有就显示,没有不显示。
2,还有一种办法就是加载页面时把页面中的操作都显示出来,在经过统一的接口来把不能操作的选项去掉。这样的话,可以把页面代码和权限代码分开。这样我觉得不至于把代码搞得太复杂。我把这个方法叫做马后炮做法。

了解完权限管理方案后,开始想怎么设计同一组里面不同成员的管理权限,额,忘记怎么昨天怎么说了,先发上来再说。


8:大批量数据查询优化解决方法
1、先批量查出所有数据,例子中是一万条一批。

2、在查出数据之后把每次的数据按一定规则存入本地文件。

3、获取数据时,通过批次读取,获得大批量数据

真心没有海量数据优化的经验,平时用的都是分页,几十万条数据而已。 附上一链接大量数据优化 /article/3511445.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: