Re: 不懂如何抽离物件(初学物件导向的问题)

楼主: PsMonkey (痞子军团团长)   2008-09-02 16:50:01
我不是 OO 强者,我都是硬干的写 OO [挺]
所以,我没办法回答你太高深的问题
只能分享一下 n 年前从 QB 转到 Java 来的时候跨过的障碍.... [远目]
首先,以某种角度而言,OO 里头的 method 跟平常的 function...
棍... 根本没什么差别... Orz
反正需要的话,参数还是要传、该 return 的还是要 return
在同一个 class 里头互相用的 method 更是有这种感觉
(前头不用写 xxxx.fooMethod(),只要写 fooMethod() 就可以用啦 XD)
棍... 那差别在哪?
不如来看字串... 如果你要把一个字串里头所有的 ps 都变成 87
传统 function 情况下大概是这样写...
String aString = "I am ps";
String bString = "ps is 87";
aString = replace(aString, "ps", "87");
bString = replace(bString, "ps", "87");
function replace(sourceString, targetString, replaceString){
//跳过,要 return 新字串就是了
//要不 return 也可,不过那跟 oo 比较没啥关系,就跳过
}
用 OO 的写法... 喔... 因为 String 这个 class Java 已经提供了
所以直接看用法,那会是
String aString = "I am ps";
String bString = "ps is 87";
aString = aString.replace("ps", "87");
bString = bString.replace("ps", "87");
基本上,正常人(或是像我这种异常人 XD)会觉得 OO 的写法比较好读
不过,光是这样好像也没什么
那么,来设计一下桥牌的游戏
如果在传统(没有 OO)的写法大概要这样写
//第一个是哪一个玩家,第二个是 13 张排,后面一个塞花色一个塞点数
int card[][][] = new int[4][13][2];
//每个人的墩数,英文应该叫做 trick 吧? (错了就算了)
int trick[] = new int[4];
//其他懒得写了,现在已经没办法用这种方法思考
//请自行想像发挥,然后跟后头 OO 版本的坐个对应
可是 OO 的话,大概会写成
//包 card 物件
class Card{
int number;
int flower; //花色 lol
//getter 跟 setter 之类就请自便
}
//包玩家
class Player{
Card card[] = new Card[13];
int trick;
//每一轮第一个,可以随便出
public Card aHand(){
//blahblah
}
//不然就会被限定花色
public Card aHand(int flower){
//blahblah
}
//赢了一墩
public void winTrick(){
trick++;
}
}
//游戏流程大概就会长成这样
Player player[] = new Player[4];
Card trickCard[] = new Card[4];
int startPlayer; //纪录这一轮由谁开始
//发牌叫牌就跳过 [茶]
trickCard[0] = player[startPlayer].aHand();
for(int i=1; i<4; i++){
trickCard[i] =
player[(startPlayer+i)%4].aHand(trickCard[0].getFlower());
}
player[this.getTrickWiner()].winTrick();
private int getTrickWiner(){
//根据 trickCard 跟 startPlayer 写一堆判断之类 blahblah
}
上面讲的这些,大概是封装 encapsulation 的范畴
如果之前已经写过不少程式,那么有了这个基础(或是跨过这个障碍)
再看其他 OO 的东西,或许会比较快乐一点
是说,我也只会这个 [远目]

Links booklink

Contact Us: admin [ a t ] ucptt.com