面試雜談,題目記錄

昨天面試了一天,筆試後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、獲取數據時,通過批次讀取,獲得大批量數據


                  真心沒有海量數據優化的經驗,平時用的都是分頁,幾十萬條數據而已。 附上一鏈接大量數據優化  http://my.oschina.net/heroyang/blog/69646






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章