<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    和風細雨

    世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

    一個解析文本中的信息并向對象賦值過程的思考.

    首先解釋一下,文本中的信息指的是 對象在文本文件中的描述,如"名稱:Bill 職位:SSE 年齡:45  薪水:10000"這個形式的.要求把這樣的信息轉換到對象Member中,對錄入出錯的情況如年齡薪水有非數字字符需要加以鑒別.

    對象基本信息如下:

    public class Member implements Comparable{
        
    // 名稱
        private String name;

        
    // 年齡
        private int age;

        
    // 職位
        private String title;

        
    // 薪水
        private int salary;
        
        .    
        
    }



    從這段字符串中找到相關的信息并設置到Member對象的相關屬性中并不難,但有幾個地方需要多加考慮:
    1.名稱職位薪水年齡的順序不一定一致.
    2.職位薪水年齡三個字段和值有可能沒有.
    3.有可能需要增加字段,此時類也需要修改.

    處理程序需要考慮解析,驗證,賦值三個環節,如果耦合在一起處理當然也能做出來,但這樣做可讀性和可維護性都不好,也背離了面向對象的初衷.好的方案應該把這三部分分開制作函數處理.

    文本解析部分:
    我的想法是首先將"名稱:Bill 職位:SSE 年齡:45  薪水:10000"以空格劈分成包含這樣元素的鏈表:
    名稱:Bill
    職位:SSE
    年齡:45 
    薪水:10000

    然后在用冒號":"劈分單個元素,前半部分作為鍵,后半部分作為值,放入一個Hashtable中:
    key    value
    名稱 Bill
    職位 SSE
    年齡 45 
    薪水 10000

    解析部分代碼如下:

        /**
         * 將分段字符串鏈表轉化成成員鏈表,不成功者記入錯誤鏈表
         * 
         * 
    @param segmentList
         *            分段字符串鏈表
         
    */

        
    private void changeSegmentToMember(List<String> segmentList) {
            
    for (String segment : segmentList) {
                Map
    <String, String> ht = StringUtil.parseStr2Map(segment, " "":");

                Member member 
    = new Member();

                
    if (member.setHtToProperties(ht)) {
                    
    // 成功賦值,將成員放入成員列表
                    memberList.add(member);
                }
     else {
                    
    // 有任何錯誤,將分段信息放入錯誤鏈表
                    errorList.add(segment);
                }

            }

        }



    賦值和驗證部分:
    然后把這個Hashtable傳入到Member的一個函數setHtToProperties中,這個函數的任務是對Hashtable中的鍵值對進行遍歷,在調用函數setValueToProperty對字段進行賦值:

    代碼如下:

        /**
         * 將哈息表中成對的值按規則輸入屬性
         * 
    @param ht
         * 
    @return
         
    */

        
    public boolean setHtToProperties(Map<String,String> ht){
            Iterator it
    =ht.keySet().iterator();
            
            
    while(it.hasNext()){
                String key
    =(String)it.next();
                String value
    =(String)ht.get(key);
                
                
    boolean isSettted=setValueToProperty(key,value);
                
                
    if(isSettted==false){
                    
    return false;
                }

            }

            
            
    return true;
        }

        
        
    /**
         * 在mapping關系中用屬性名去找屬性對應的變量,是則賦值;如找不到或轉化出錯則返回假
         * 
    @param propertyName 屬性名,如name對應的名稱
         * 
    @param propertyNalue 屬性值,如那么對應的Bill
         * 
    @return
         
    */

        
    private boolean setValueToProperty(String propertyName,String propertyNalue){
            
    if(propertyName.equals("名稱")){
                name
    =propertyNalue;
            }

            
    else if(propertyName.equals("年齡")){
                
    try{
                    
    int ageTemp=Integer.parseInt(propertyNalue);
                    age
    =ageTemp;
                }

                
    catch(Exception e){
                    
    return false;
                }
                
            }

            
    else if(propertyName.equals("職位")){
                title
    =propertyNalue;
            }

            
    else if(propertyName.equals("薪水")){
                
    try{
                    
    int salaryTemp=Integer.parseInt(propertyNalue);
                    salary
    =salaryTemp;
                }

                
    catch(Exception e){
                    
    return false;
                }

            }

            
    else{
                
    return false;
            }


            
    return true;
        }


    建立setValueToProperty函數的初衷是,用分支語句建立起鍵值與字段的對應關系,對應上了則進行賦值,這和Mapping有點類似,有些轉化和驗證工作也在分支內進行,只要驗證出現問題即退出處理.

    這樣的處理方法帶來了如下好處:
    1.外界的類只需要解析文本,不需也不應該知道如何向Member的對應字段賦值,這個工作應該由Member自己進行,setHtToProperties函數幫助達成了這一點,有效降低了Member和其它類的耦合程度.
    2.即使職位薪水年齡三個字段和值缺失,也不影響其它字段的賦值過程.
    3.如果增加字段,setValueToProperty函數中只需要增加一個Mapping分支即可,其它地方無須改動.
    4.對數據的校驗工作可以統一在setValueToProperty函數中完成.

    進行了如此處理后,代碼量也不見得比混合處理多多少,而程序更加清晰,適應性也增強了,經得起不斷更改. 比解析驗證賦值混合在一起的方案要強的多.

    完整代碼下載:
    http://m.tkk7.com/Files/sitinspring/MemberProcessor20071207163615.rar

    posted on 2008-02-22 10:28 和風細雨 閱讀(151) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产自国产自愉自愉免费24区 | 不卡精品国产_亚洲人成在线| 99在线精品视频观看免费| 曰批免费视频播放在线看片二 | 黄页网站在线看免费| 国产成人无码区免费网站| 黄色网址免费在线| 亚洲色少妇熟女11p| 亚洲成人黄色网址| 亚洲AV日韩精品久久久久久久| 亚洲精品国产成人影院| 日本黄色免费观看| 啦啦啦高清视频在线观看免费| 99xxoo视频在线永久免费观看| 成人免费av一区二区三区| 男人扒开添女人下部免费视频| 亚洲综合成人婷婷五月网址| 亚洲熟妇色自偷自拍另类| 亚洲好看的理论片电影| 亚洲精品国偷自产在线| 亚洲免费观看视频| 亚洲午夜久久久久妓女影院 | APP在线免费观看视频| 久久www免费人成看国产片| 免费夜色污私人影院网站| 国产av无码专区亚洲av毛片搜| 亚洲欧美日韩中文高清www777| 在线综合亚洲欧洲综合网站| 亚洲一级视频在线观看| 亚洲日韩国产精品无码av| 亚洲成年人电影在线观看| 亚洲AV成人噜噜无码网站| 国产成人精品日本亚洲直接| 色噜噜亚洲男人的天堂| 亚洲另类无码专区丝袜| 亚洲AV永久无码精品一福利| 亚洲AV无码男人的天堂| 色视频在线观看免费| 一区二区视频免费观看| 久久er国产精品免费观看8| 国产一级片免费看|