春天里,百花香...
#
在面向?qū)ο缶幊讨校覀円话悴捎脧捻斚蛳碌木幊谭绞剑聪仍O(shè)計(jì)類的層次,如View,Controller,Service,Dao,Domain,Util等,再完善各層中的類。在這個(gè)過程中,我發(fā)現(xiàn)按功能和形態(tài)來分,系統(tǒng)中類可分為以下幾個(gè)類別:
1.實(shí)體類(Entity Classes):這種類一般是現(xiàn)實(shí)世界事物在代碼世界中的抽象表示,和現(xiàn)實(shí)事物有著一一對應(yīng)關(guān)系.存儲到持久介質(zhì)中時(shí)一般對應(yīng)著一條記錄.如MIS系統(tǒng)中常見的雇員類Employee,論壇系統(tǒng)中常見的Topic等.由于這些類可以直接從現(xiàn)實(shí)事物中歸納抽象得來,寫出它們的框架代碼一般相對方便容易,但要真正理順實(shí)體類之間的關(guān)系需要投入不少精力,這些類一般處于Domain層中.
2.通道類(Plumbing Classes):這種類一般用于充當(dāng)傳輸實(shí)體類的通道,在編程中,經(jīng)常需要從持久層取出一個(gè)或多個(gè)實(shí)體類的對象或是將實(shí)體類的對象存儲到持久層中,這種任務(wù)一般由通道類來完成.它們一般由Service或是Dao層中的類來承擔(dān).這些類一般不保存狀態(tài),對外界來說,它們的對外接口(Public Interface)一般比具體的實(shí)現(xiàn)重要,在數(shù)量較多時(shí),也經(jīng)常抽象出一些上層的抽象類或是接口出來以方便調(diào)用.
3.輔助類(Assistant Classes):這些類一般起輔助任務(wù),一般可以把共通的處理和變量放在其中供其他層次類調(diào)用,這樣做一能避免散彈式修改,二能減少重復(fù)代碼,三能提高代碼復(fù)用度.輔助類一般放在Util包中.
4.框架類(Framework Classes):這些類一般由固定的框架提供,程序員不能改變.在類的層次上它一般處于界面和業(yè)務(wù)層之間,即控制層的位置,jsp/servlet中的Servlet,Struts1,2中的Action都是這樣的類,它承擔(dān)了接受用戶輸入,并展示業(yè)務(wù)處理的結(jié)果的任務(wù).
一個(gè)技術(shù)人員要生存,要發(fā)展,要成一番事業(yè),必須遵循一定固定的法則,若逆天而行而不自覺,輕則徒勞無功,白費(fèi)精力;重則無法立足,庸碌一生。因此把握住自己的發(fā)展之道是技術(shù)人首要的大事,只有走在正確的道路上,前進(jìn)才有意義。
一個(gè)技術(shù)人員,首先要固本培元,什么是技術(shù)人的根本呢?無論語言,框架和技術(shù)如何發(fā)展,數(shù)據(jù)結(jié)構(gòu)和算法都是其核心內(nèi)容,所謂萬變不離其宗,有了良好的數(shù)據(jù)結(jié)構(gòu)和算法的根基,接受并掌握一個(gè)新興事物不過旬月時(shí)間,若沒有而盲目跟隨,事倍而功半矣。另外面向?qū)ο蟮木枰惨盐?從根本上來講,任何現(xiàn)代框架其核心思想還是沒有超越面向?qū)ο蟮姆懂?都是面向?qū)ο蟮睦^承和發(fā)展,理解掌握了面向?qū)ο蟮乃枷?就把握住了框架根本性的東西,學(xué)習(xí)掌握起來就更容易把握其本質(zhì).
其次,技術(shù)人員必須把握主流技術(shù)方向才不至于迷失自己。若在支流中迷失自己恐有空執(zhí)屠龍之技無用武之地之憂,古代也許還能自娛自樂,現(xiàn)代社會這樣做溫飽都無法解決,房子,車子,孩子更是白扯;只有置身主流,才能繼續(xù)奮斗下去。當(dāng)前的主流技術(shù)方向,無非SSH(Struts1/2,Spring,Hibernate)而已,徹底弄清楚它們,才有安身立命之本.君不見諸多招聘廣告,均寫SSH乎.這三項(xiàng)其實(shí)也不好掌握,尤其Hibernate,掌握不精深也不行,有些大俠也曾陰溝里翻過船。
其三,技術(shù)人員要樂于善于總結(jié)提高,對于已經(jīng)掌握的內(nèi)容,要及時(shí)歸納總結(jié)到紙面上,這樣做一能梳理脈絡(luò),讓自己掌握得更全面細(xì)致;二能查漏補(bǔ)缺,發(fā)現(xiàn)以前忽視或是未接觸過的領(lǐng)域;三能求其友聲,放在博客上供大家分析閱讀討論,彌補(bǔ)自己的不足.有此三益,于己于人都是一件大好事,何樂而不為呢?
其四,技術(shù)人員要展示自己的能力和價(jià)值,應(yīng)該具備自己的產(chǎn)品,它可以用來鞏固和展現(xiàn)自己的實(shí)力,在產(chǎn)品的研發(fā)過程中,技術(shù)人員能把自己的知識智慧實(shí)用化,可避免走入象牙塔之患;外界也能通過產(chǎn)品來了解發(fā)掘自己.這也是一件于己于人都有利的事情.
其五,技術(shù)人員應(yīng)該具備完整的思想體系,有自己獨(dú)到的見解并能有所突破創(chuàng)新. 人云亦云無異于鸚鵡學(xué)舌,有何能哉? 要想上一個(gè)層次,必須鯉魚躍龍門. Gosing和Kaven兩人可作為最好的榜樣。
最后,廣博的知識不可少.拘泥于一處難免死鉆牛角尖,很多情況下?lián)Q一種思維頓時(shí)有撥云見日之感,如有閑暇,技術(shù)人員應(yīng)該跳出圈子,廣采能用之材為我所用.
摘要: 稱球問題經(jīng)常是面試中的常客,這里我用做了一個(gè)稱球的程序,主要的方法就是遞歸和掃描,貼出來請大家指正。
閱讀全文
摘要: /** *//**
* 二叉樹節(jié)點(diǎn)類
* @author HEYANG
* @since 2008-7-26 下午02:59:06
*/
class Node<T extends Comparable> {
 ...
閱讀全文
摘要: 這是一個(gè)美國IT企業(yè)的面試題,原題大意是從一個(gè)文件中讀取出可連通的城市對,給出兩個(gè)城市,判斷是否可連通,如果可連通就輸出yes,不可連通就輸出no,否則給出命令行幫助。
其實(shí)判斷連接狀態(tài)不用遍歷圖,用蔓延法即可,具體做法就是從起始城市開始,依次改變其周邊連通城市的連通狀態(tài),再從周邊開始向周邊連通城市蔓延,如果能蔓延到結(jié)束城市的周邊可連通城市,則說明兩個(gè)城市是完全可連通的。這種做法和多米諾骨牌效應(yīng)很像。我姑且稱之為蔓延法。
閱讀全文
找出以下字符串=符號后面對應(yīng)的屬性值

"職務(wù)=GM 薪水=50000 , 姓名=職業(yè)經(jīng)理人 ; 性別=男 年齡=45 ";

import java.util.regex.Matcher;
import java.util.regex.Pattern;


/** *//**
* 用正則表達(dá)式找出每個(gè)屬性對應(yīng)的值
* @author HEYANG
* @since 2008-7-23 下午08:12:45
*/

public class RegexFindProperty
{


public static void main(String[] args)
{
String input = "職務(wù)=GM 薪水=50000 , 姓名=職業(yè)經(jīng)理人 ; 性別=男 年齡=45 ";
// =號和空白符之間是非空格字符,這種寫法比去分開組合字母,數(shù)字和漢字的方式要快捷
Pattern pattern = Pattern.compile("=(\\S+)\\s*");

// 用Pattern類的matcher()方法生成一個(gè)Matcher對象
Matcher m = pattern.matcher(input);

// 使用find()方法查找第一個(gè)匹配的對象
boolean result = m.find();

// 使用循環(huán)找出模式匹配的內(nèi)容打印

while (result)
{
// 取得匹配的結(jié)果
String replaceStr = m.group(1);
System.out.println("匹配的屬性等于=" + replaceStr);
result = m.find();
}
}
}
摘要: package com.sitinspring.datetime;
import java.util.ArrayList;
import java.util.List;
public class MonthlyCalendar{
private static f...
閱讀全文
摘要: 輸出示例:
當(dāng)前日期時(shí)間為:2008.07.18 10:48:57
當(dāng)前日期為:2008.07.18
當(dāng)前日期為:2008.7.18
當(dāng)前時(shí)間為:10:48:57
2008.07.05與2008.07.18之間相隔:13天
當(dāng)前年月為:2008.07
本月第一天為周2
本月有31天
閱讀全文
Comparator的具體實(shí)現(xiàn)類

public class AgeComparator implements Comparator
{

public int compare(Object op1, Object op2)
{
Employee eOp1 = (Employee) op1;
Employee eOp2 = (Employee) op2;

// 按年齡排序
return eOp1.getAge()-(eOp2.getAge());
}
}


public class NameComparator implements Comparator
{

public int compare(Object op1, Object op2)
{
Employee eOp1 = (Employee) op1;
Employee eOp2 = (Employee) op2;

// 按姓名排序
return eOp1.getName().compareTo(eOp2.getName());
}
}


public class SalaryComparator implements Comparator
{

public int compare(Object op1, Object op2)
{
Employee eOp1 = (Employee) op1;
Employee eOp2 = (Employee) op2;

// 按薪水排序
return eOp1.getSalary()-(eOp2.getSalary());
}
}

Employee類:

public class Employee
{
protected String name;
protected int age;
protected int salary;

public Employee(String name,int age,int salary)
{
this.name=name;
this.age=age;
this.salary=salary;
}

public int getAge()
{
return age;
}

public void setAge(int age)
{
this.age = age;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public int getSalary()
{
return salary;
}

public void setSalary(int salary)
{
this.salary = salary;
}
}

測試:

public class Main
{

public static void main(String[] args)
{
List<Employee> employees=new ArrayList<Employee>();
employees.add(new Employee("Andy",21,2000));
employees.add(new Employee("Felix",21,3000));
employees.add(new Employee("Bill",35,20000));
employees.add(new Employee("Helen",21,10000));
employees.add(new Employee("Cindy",28,8000));
employees.add(new Employee("Douglas",25,5000));
// 按名稱排序
Collections.sort(employees,new NameComparator());
display(employees);

// 按年齡排序
Collections.sort(employees,new AgeComparator());
display(employees);
// 按薪水排序
Collections.sort(employees,new SalaryComparator());
display(employees);
}

public static void display(List<Employee> employees)
{

for(Employee e:employees)
{
System.out.println("雇員名="+e.getName()+" 年齡="+e.age+" 薪水="+e.getSalary());
}
System.out.println();
}
}

輸出:
雇員名=Andy 年齡=21 薪水=2000
雇員名=Bill 年齡=35 薪水=20000
雇員名=Cindy 年齡=28 薪水=8000
雇員名=Douglas 年齡=25 薪水=5000
雇員名=Felix 年齡=21 薪水=3000
雇員名=Helen 年齡=21 薪水=10000

雇員名=Andy 年齡=21 薪水=2000
雇員名=Felix 年齡=21 薪水=3000
雇員名=Helen 年齡=21 薪水=10000
雇員名=Douglas 年齡=25 薪水=5000
雇員名=Cindy 年齡=28 薪水=8000
雇員名=Bill 年齡=35 薪水=20000

雇員名=Andy 年齡=21 薪水=2000
雇員名=Felix 年齡=21 薪水=3000
雇員名=Douglas 年齡=25 薪水=5000
雇員名=Cindy 年齡=28 薪水=8000
雇員名=Helen 年齡=21 薪水=10000
雇員名=Bill 年齡=35 薪水=20000



摘要: 回溯法有“通用的解題法“之稱。用它可以系統(tǒng)的搜索一個(gè)問題的所有解或任一解。會所法是一個(gè)既帶有系統(tǒng)性又帶有跳躍性的搜索算法,他在包含問題的所有解的解空間樹中,按照深度有限的策略,從根節(jié)點(diǎn)出發(fā)搜索解空間樹,算法搜索至解空間樹的任一節(jié)點(diǎn)時(shí),總是先判斷該節(jié)點(diǎn)是否肯定不包含問題的解。如果肯定不包含,則跳過對該節(jié)點(diǎn)為根的子樹的系統(tǒng)搜索,逐層向其祖先節(jié)點(diǎn)回溯,否則進(jìn)入該子樹,繼續(xù)按照深度優(yōu)先的策略進(jìn)行搜索。回溯法在用來求問題的任一接時(shí),只要搜索到問題的一個(gè)解就可以結(jié)束。
這種深度優(yōu)先的解的算法稱為回溯法,它適合于解一些組合數(shù)較大的問題。
用回溯法解n皇后問題時(shí),可以用一棵完全n叉樹來表示其解空間。剪去不滿足行列和斜線攻擊的子樹后,剩下的就是問題的解答。
閱讀全文
sitinspring(http://m.tkk7.com)原創(chuàng),轉(zhuǎn)載請注明出處.