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

"職務=GM 薪水=50000 , 姓名=職業經理人 ; 性別=男 年齡=45 ";

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


/** *//**
* 用正則表達式找出每個屬性對應的值
* @author HEYANG
* @since 2008-7-23 下午08:12:45
*/

public class RegexFindProperty
{


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

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

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

// 使用循環找出模式匹配的內容打印

while (result)
{
// 取得匹配的結果
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...
閱讀全文
摘要: 輸出示例:
當前日期時間為:2008.07.18 10:48:57
當前日期為:2008.07.18
當前日期為:2008.7.18
當前時間為:10:48:57
2008.07.05與2008.07.18之間相隔:13天
當前年月為:2008.07
本月第一天為周2
本月有31天
閱讀全文
Comparator的具體實現類

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



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