學(xué)習(xí)了很多人捧為經(jīng)典的ppp之后,我開始考慮在所參與的團(tuán)隊中采用敏捷開發(fā)的方式,除了結(jié)對編程,基本采用XP編程的方式。跌代計劃,TDD,重構(gòu),積極溝通。然而在此過程中卻遇到很多尷尬的問題,一個是團(tuán)隊中的人員經(jīng)常流動,導(dǎo)致剛剛熟悉的開發(fā)環(huán)境,又要找新人代替;一個是團(tuán)隊中的成員水平參差不齊,難以達(dá)成一致的良好設(shè)計規(guī)范,也許又是不得不做一些硬性的規(guī)定。
這里最大的問題是:XP強(qiáng)調(diào)代碼即設(shè)計,那就要求每個人都對代碼的編寫非常熟練,對團(tuán)隊中每個成員的編程水平要求很高,然而這和相對較少的項目經(jīng)費(fèi),及短暫的項目周期難以協(xié)調(diào)。
更為可怕的是,項目中的人員職責(zé)不明,沒有明確的負(fù)責(zé)人,而由沒有軟件開發(fā)和管理經(jīng)驗的人主導(dǎo)。
Hibernate根據(jù)配置文件從數(shù)據(jù)庫中把關(guān)系型的數(shù)據(jù)以對象的形式挖掘出來,那么假如我有一個Table控件,可以放置展現(xiàn)任何的表結(jié)構(gòu),如何在運(yùn)行期做到把數(shù)據(jù)載入呢?Hibernate已經(jīng)把數(shù)據(jù)讀成對象的形式,就注定沒有JDBC一般靈活,為次可以通過編寫如下的兩個工具方法來實現(xiàn):
import java.lang.reflect.Method;
/**
* 獲取指定bean的指定字段的值
*/
public class BeanUtils {
private BeanUtils(){}
/**
* 根據(jù)beanName和列名字獲取hql語句
* @param beanName
* @param columnNames
* @return 以list形式返回數(shù)據(jù)的hql語句
*/
public static String getHql(String beanName, String[] columnNames){
StringBuffer sb = new StringBuffer();
sb.append("select new list(");
StringBuffer columnString = new StringBuffer();
for(int i=0,len=columnNames.length;i<len;i++){
columnString.append(",");
columnString.append(columnNames[i]);
}
sb.append(columnString.substring(1));
sb.append(") from ");
if(Character.isUpperCase(beanName.charAt(0)))
sb.append(beanName);
else
sb.append(upperFirstChar(beanName));
return sb.toString();
}
/**
* @param bean 獲取到的域?qū)ο?br />
* @param fieldName 欲獲取值的字段名
* @return 字段在當(dāng)前bean封裝下的值
*/
public static Object getFieldByName(Object bean, String fieldName){
try {
Method m = bean.getClass().getMethod("get"+upperFirstChar(fieldName), null);
return m.invoke(bean, null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String upperFirstChar(String orig){
return Character.toUpperCase(orig.charAt(0)) + orig.substring(1);
}
}
按照已經(jīng)處理后,我們就可以既應(yīng)用Hibernate對象訪問的優(yōu)點(diǎn),又不損失字符串的靈活性,代碼中應(yīng)用了Hibernate的select特性及java的反射機(jī)制
Google 為開源項目建立起了資源庫. 這個google站點(diǎn)是google為推動開源發(fā)展做的又一努力!
Google在FAQ上說道, Google意識到對開源項目開發(fā)者而言,有多種的選擇未嘗不是一件好事。 這個開源資源庫強(qiáng)調(diào)軟件資源的儲存,郵件列表討論和bug追蹤.
需要說明的是google資源對選擇了具備一定的合適許可證的知名項目(比如sourceforge上的項目來提供下載)。站點(diǎn)采用SVN進(jìn)行管理。
您對google的新舉動有何高見呢?
Apache commons-email是對javamailAPI的一層封裝,經(jīng)封裝后的發(fā)送郵件的代碼變得極為簡單,但這里有一個中文支持的小問題。
commons-email主要的封裝類是Email類,這是一個抽象類,該框架給出了SimpleEmail的默認(rèn)實現(xiàn),但該實現(xiàn)并不支持中文,即使調(diào)用Email的setCharset也不起作用。
事實上,SimpleEmail調(diào)用了Email超類中的setContent方法來設(shè)置郵件內(nèi)容(通過setMsg方法),而在設(shè)置內(nèi)容時,又采用了默認(rèn)的英文字符集,我們只要在代碼中直接調(diào)用email類的setContent方法就可以支持中文了,但要注意setContent具備兩個參數(shù),第一個是內(nèi)容對象,第二個則是內(nèi)容類型,我們把第二個參數(shù)設(shè)置為:
SimpleEmail.TEXT_PLAIN + "; charset=utf-8", 即可。理由如下面源代碼所示:
public void setContent(Object aObject, String aContentType)
{
......
// set the charset if the input was properly formed
String strMarker = "; charset=";
int charsetPos = aContentType.toLowerCase().indexOf(strMarker);
if (charsetPos != -1)
{
// find the next space (after the marker)
charsetPos += strMarker.length();
int intCharsetEnd =
aContentType.toLowerCase().indexOf(" ", charsetPos);
if (intCharsetEnd != -1)
{
this.charset =
aContentType.substring(charsetPos, intCharsetEnd);
}
else
{
this.charset = aContentType.substring(charsetPos);
}
}
}
}
即有一個文本解析的過程。
eclipse很麻煩的一點(diǎn)就是eclipse的頻繁升級+IT技術(shù)人員追求最先進(jìn)的技術(shù)+eclipse平臺對插件不保證向下兼容,先在eclipse的官方網(wǎng)站http://www.eclipse.org提供了一個一站式服務(wù)的好辦法,就是Callisto,這里面集成了圖形設(shè)計器,WTP等大多數(shù)能想象到的功能,免去了我們諸多麻煩.3.2以后的eclipse必將更加美好!