實踐專案一 專案開發團隊分配
- 前言
- MVC模式
- 實作目標:
- 整體結構圖:
- 整體功能實作分析:
- 需求分析:
- 軟體設計結構
- 具體實作
- 用戶注冊登錄模塊:
- 開發人員管理模塊:
- 資料的添加:
- 資料的回傳:
- 開發團隊調度模塊:
- 需求說明
- 團隊的創建:
- 開發團隊調度管理模塊
- 開發專案管理模塊:
- 主界面的實作
- 總結
前言
| ??相信大家在之前的學習當中也有了不少的識訓吧,對于自己的能力檢驗呢,最好的辦法就是通過實踐啦,那要怎么實踐呢,本博主這次主要講解了這次的實踐專案,這次的實踐專案是開發團隊分配調度的一個軟體,那么關于本次專案開發也主要體現了前面JAVA基礎知識的相關使用,以及相關知識的熟練度,接下來就和我一起走進本次實踐,歡迎大家一起交流學習! |

MVC模式
在這里我們首先介紹一個開發模式:MVC結構
??MVC 模式(Model–view–controller)是軟體工程中的一種軟體架構模式,它把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)

??簡而言之在本次專案當中的思想在于:把整個專案分成多個部分的耦合; 并且主要分為:
??M 模型塊,即抽象父類
??V 視圖塊,列印出用戶互動資訊
??C 控制塊:用于實作對資料的各種操作
實作目標:
1.模擬實作員工基于文本界面的<<專案開發團隊分配管理軟體>>
2.熟悉Java面對物件的高級特性,進一步掌握編程技巧和除錯技巧
3.主要涉及以下知識點:
???? 類的繼承和多型性
???? 物件的值傳遞、介面
???? static和final修飾符
???? 特殊類的使用:包裝類、抽象類、內部類
???? 例外處理
???? Java基本語法和流程控制
???? 陣列,ArrayList集合
整體結構圖:
??首先我們先來看一下關于本次專案的整體一個系統功能的結構圖:
它主要是是分為幾個重要的板塊,關于用戶注冊登錄,開發人員管理,開發團隊調度以及開發專案管理.

??了解了系統功能結構,我們接下來再看一下整個專案代碼的運行流程,以方便我們進行整體思路的架構還有專案的實作和完成

整體功能實作分析:
??那么從剛才的兩張圖來說我們可以看出:想要完成整個專案呢,我們總共需要完成四個小模塊,而每一個模塊都有自己的功能,通過兩圖可以看出,完成該專案大致的思路都是完成各自模塊的增、刪、改、查,這幾個功能,相信大家都不陌生,難點在于:該專案需要把各個模塊相聯系起來,雖然第一感覺也不算太難,但真正開始聯系的時候可能會出現很多問題,比如博主就遇到了:模塊之間的資料銜接有問題: 每次跨模塊呼叫資料時,資料有差異,就很頭疼,其實問題在于:每次呼叫不同類,實體化物件的時候沒有注意其記憶體地址的改變,
??總之,完成該專案各個模塊之間的銜接,一定要注意每個實作功能服務類要回傳資料,不然后面呼叫起來會很麻煩;一定要注意,實體化物件時地址的改變(如果需要多次呼叫同一個功能類中的資料,盡量只實體化一次,其他的把實體化的物件以引數的形式傳遞即可),下面就是博主對該專案的實作思路和理解,

需求分析:
該軟體實作以下功能:
???軟體啟動時,首先進入登錄界面進行注冊和登錄功能,
???當登陸成功后,進入萊單,首先就可以對開發人員賬戶和密碼進行修改,
???然后可以對開發人員進行增刪改操作
???人員添加成功后,根據榮單提示,榛于現有的公司成員,組建一個開發團隊以開發一個新的專案,
???組建程序包括將成員插入到團隊中,或從團隊中洗掉某成員,還可以列出團隊中現有成員的串列,開發團隊成員包括架構師、設計師和程式員,
?? ?團隊組建成功,則可以進入專案模塊,添加專案,分配開發團隊進行開發,
軟體設計結構
該軟體由以下三個模塊組成:

?com.team.view 模塊為主控模塊,負責對選單的顯示和處理用戶操作
?com.team.service模塊為物體物件(Employee及其子類 如程式員等)的管理模塊,NanmelistService和TeamService類分別用各自的陣列來管理公司員工和開發團隊成員物件
?ProjectService 是對專案的操作物件類
?domaln模塊 為Employee及其子類等JavaBean類所在的包
??當然啦,這里也可以采用MVC模式,道理是一樣的

具體實作
用戶注冊登錄模塊:
????????定義一個LoginView類
???實作注冊方法
????▼如果沒有賬戶則需要注冊
????▼如果有賬號則直接進行登錄
???實作登錄功能
????▼判斷用戶輸入的值是否正確
????▼如果正確則進入軟體選單
????▼如果錯誤則重新輸入,限制次數只有5次,超過次數則程式停止,重新啟動
???修改用戶密碼功能
????▼可以實作對用戶名,密碼,或者兩者都可以進行修改即可,
開發人員管理模塊:
??該模塊主要的難點在于:我們需要先存盤不同員工的資料,每個型別的員工我們需要建立相應的類,然后通過繼承來將幾個類之間聯系起來,建立每個類時,我們需要想清楚該類有哪些屬性,哪個屬性是可以繼承的,哪個屬性是自己獨有的,博主這里是通過集合來存盤的資料,
首先
????????在NameListService類中完成功能操作
??●實作員工的添加(根據職業添加(無, 程式員,設計師,架構師) )
??●實作員工的修改(至少修改員工的姓名,年齡,工資)
??●實作員工的洗掉(注意員工id需要動態顯示,也就是洗掉后,員工id需要更新)實作員工的查看(顯示所有資料)

?? 說明
???getAllEmployees()方法:獲取當前所有員工,
??????回傳:包含所行員工集合
?? ?getEmployee(id:int)方法:獲取指定ID的員工物件,
??????引數:指定員工的ID
??????回傳:指定員工物件口
??????例外:找不到指定的員工
?? 在service子包下提供自定義例外類:TeamException
?? 另外可根據需要自行添加其他方法或多載構造器
資料的添加:
employees.add(new Employee(count, "馬云 ", 22, 3000));
employees.add(new Architect(++count, "馬化騰", 32, 18000, new NoteBook("聯想T4", 6000), 60000, 5000));
employees.add(new Programmer(++count, "李彥宏", 23, 7000, new PC("戴爾", "NEC 17寸")));
employees.add(new Programmer(++count, "劉強東", 24, 7300, new PC("戴爾", "三星 17寸")));
employees.add(new Designer(++count, "雷軍 ", 50, 10000, new Printer("激光", "佳能2900"), 5000));
employees.add(new Programmer(++count, "任志強", 30, 16800, new PC("華碩", "三星 17寸")));
employees.add(new Designer(++count, "柳傳志", 45, 35500, new PC("華碩", "三星 17寸"), 8000));
employees.add(new Architect(++count, "楊元慶", 35, 6500, new Printer("針式", "愛普生20k"), 15500, 1200));
employees.add(new Designer(++count, "史玉柱", 27, 7800, new NoteBook("惠普m6", 5800), 1500));
employees.add(new Programmer(++count, "丁磊 ", 26, 6600, new PC("戴爾", "NEC17寸")));
employees.add(new Programmer(++count, "張朝陽 ", 35, 7100, new PC("華碩", "三星 17寸")));
employees.add(new Designer(++count, "楊致遠", 38, 9600, new NoteBook("惠普m6", 5800), 3000));
??值得注意的是,這里存盤時,是通過new 物件,將資料以物件的帶參構造器傳入的資料,用該方法傳遞資料,需要在該類里重寫toString方法,不然的話,得到的只是該物件的地址,資料并沒有成功地傳入,
??資料的洗掉: 我們在洗掉資料時,需要將員工的號碼也前移一位,這樣得到的資料看著才更順暢,我們可以通過回圈遍歷洗掉過后的資料,使得他們的號碼依次減一:
資料的回傳:
//得到所有員工資料集合
public ArrayList<Employee> getAllEmployees() {
return employees;
}
//得到當前員工
public Employee getEmployee(int id) throws TeamException {
for (int i = 0; i < employees.size(); i++) {
if (employees.get(i).getId() == id) {
return employees.get(i);
}
}
throw new TeamException("該員工不存在");
}
??完成基本的功能之后,最重要的是我們需要將的到的資料作為回傳值回傳,以便于下一個模塊對其的呼叫,這里博主寫了 開發人員資料的回傳,以及得到某一個員工資料的回傳,
??這兩個回傳方法,在添加團隊成員時,可以用到,
開發團隊調度模塊:
??該模塊的主要難點在于:把最后的主界面和開發人員管理模塊相聯系起來,這就要注意引數的傳遞要準確, 就比如,博主在添加團隊成員,呼叫開發人員的模塊時發現,在主界面對開發人員實作的增刪改查后的資料,在團隊模塊里找不到了!得到的只是開發人員模塊里初始化的資料,這個問題,博主改了好久,想起都頭疼!問題在于:在團隊模塊呼叫資料時,new了新物件,在主界面也new 了新物件,也就是說:主界面進行的增刪改查后的資料,只保存到了主界面,而團隊模塊只是重新呼叫了開發團隊的資料! 最后,博主才把主界面的物件做為引數傳到了團隊模塊,才完善了該功能,
需求說明
----------------------・ ゚*。・゚??。需求說明。??・ ゚*。・゚----------------------
如果添加操作因某種原因失敗,將顯示類似以下資訊(失敗原因視具體原因而不同):
1-團隊串列 2-添加團隊成員 3-洗掉團隊成員 4-退出請選擇(1-4): 2
------------------------------------------添加成員---------------------------------
請輸入要添加的員工ID: 2
添加失敗,原因:該員工已是某團隊成員
按回車鍵繼續…
失敗資訊包含以下幾種: (需要拋出自定義例外)
??成員己滿,無法添加
??該成員不是開發人員,無法添加
??該員工已在木開發團隊中
??該員工已是某團隊成員
??團隊中至多只能有一名架構師(以下判斷可借用instanceof進行判斷)
??團隊中至多只能有兩名設計師
??團隊中至多只能有三名程式員
團隊的創建:
//增加團隊成員
public void addMember(Employee e) throws TeamException {
if (total >= MAX_MEMBER){
throw new TeamException("成員已滿,無法添加");}
if (!(e instanceof Programmer)) {
throw new TeamException("該成員不是開發人員,無法添加");
}
// Programmer p = (Programmer)e;
if (isExist(e)) {
throw new TeamException("該員工已在本團隊中");
}
Programmer p = (Programmer)e;
if(("BUSY".equalsIgnoreCase(p.getStatus().getNAME()))) {
throw new TeamException("該員工已是某團隊成員");
}else if ("VOCATION".equalsIgnoreCase(p.getStatus().getNAME())){
throw new TeamException("該員工正在休假,無法添加");
}
//獲取team已有成員中架構師,設計師,程式員的人數
int numOfArch = 0, numOfDsgn = 0, numOfPrg = 0;
for (int i = 0; i < total; i++) {
if (team[i] instanceof Architect) {numOfArch++;}
else if (team[i] instanceof Designer){ numOfDsgn++;}
else if (team[i] instanceof Programmer){ numOfPrg++;}
}
if (p instanceof Architect) {
if (numOfArch >= 1)
{throw new TeamException("團隊中至多只能有一名架構師");}
} else if (p instanceof Designer) {
if (numOfDsgn >= 2)
{throw new TeamException("團隊中至多只能有兩名設計師");}
} else if (p instanceof Programmer) {
if (numOfPrg >= 3)
{throw new TeamException("團隊中至多只能有三名程式員");}
}
//將p添加到現有team
team[total++] = p;
//p的屬性賦值
p.setStatus(Status.BUSY);
p.setMemberId(counter++);
}
??我們可以先呼叫增刪改查后,開發人員的資料,得到想要存到團隊里的員工ID,添加到創建的陣列中,在添加團隊成員時,按照添加團隊成員的要求,設定判斷陳述句限制添加成員的類別和數量,
??在創建團隊時,我們可以在第一個團隊創建后,在退出這里,把團隊的資料保存到一個新建的集合里,然后初始化團隊的資料,以便于下一個團隊可以像第一個團隊那樣重新添加團隊成員
開發團隊調度管理模塊
參考實作: TeamService類的設計:

功能:關于開發團隊成員的管理:添加、洗掉等(還需要自行實作),
說明:
???counter為靜態變數,用來為開發團隊新增成員自動生成團隊中的唯一ID, 即memberld (提示:應使用增1的方式)
???MAX_ MEMBER:表示開發團隊最大成員數
???team陣列:用來保存當前團隊中的各成員物件(也可以用一個新的集合)
???total:記錄團隊成員的實際人數

說明:
???listSvc 和teamSvc屬性:供類中的方法使用
???enterMainMenu ()方法:主界面顯示及控制方法,
???以下方法僅供enterMainMenu()方法呼叫:
?????listAllEmplovees ()方法:以表格形式列出公司所有成員
?????getTeam()方法:顯示團隊成員串列操作
?????addMember ()方法:實作添加成員操作
?????deleteMember ()方法:實作洗掉成員操作
開發專案管理模塊:
該模塊需要實作的功能主要就是把添加進來的專案,隨機分配給團隊,
??實作專案的添加 (添加參考的專案)
??實作專案的分配 (團隊隨機分配一個專案進行開發)
??實作專案的查看 (顯示所有專案及是否被開發)
??實作專案的洗掉 (被開發中的專案不能被洗掉)
??不過我們需要注意的是,在分配時,我們要根據專案的狀態這個屬性來判斷該專案是否被開發,以便于后面執行分配時,避免重復分配,以及專案沒有確保分配到團隊中,在這里,我們采用了一個while回圈判斷:
//隨機分配專案
Random ra = new Random();
int ranNum = ra.nextInt(pro.size());
Project project = this.pro.get(ranNum);
while (project.getStatus()) //使用while回圈,判斷如果專案已經開發,重新讀取
{
ranNum= ra.nextInt(pro.size());//重新獲取亂數
project=this.pro.get(ranNum);//集合重新取出隨機專案
}
project.setTeamName(teamName);
project.setTeam(team);
project.setStatus(true);
pro.set(ranNum, project);
在處理例外時,我們可以重寫例外輸出的資訊,以便于代碼更好的可讀性,
try {
throw new TeamException("該專案不存在");
} catch (TeamException e) {
e.printStackTrace();
}
在domain包中完成專案物體類Project的創建

在service包中完成專案操作類ProjectService的創建

??其他還需要的方法屬性可自行添加
主界面的實作
IndexView類的設計
??最后在view包中撰寫專案程式運行主界面類IndexView
??將前面4個模塊的內容裝在一起,并運行軟體,操作基本功能,除錯bug,專案開發完成,

總結

??本專案的實作還是具有一定的難度,該專案主要的難點在于:讓每個模塊相互銜接,以及各個模塊之間資料的引數傳遞要準確,還有就是在創建集合或者陣列保存資料時,注意集合或者陣列的初始化,保下一次資料的存盤不會受到影響,該專案是博主寫的第一個較大的專案,寫了好久,中間遇到了很多的問題,也修改了很久,有時候遇到的問題也相當頭疼,幸好在老師的幫助下,把問題解決掉以后,瞬間豁然開朗的那種感覺,還是挺不錯的,在遇到難以解決的問題,或者自己已經花了很多時間都沒有解決掉問題時,別頭鐵(一股腦地自己改,可能會越改越麻煩!),多和同學、老師交流請教,
??最后附上本次專案的代碼檔案,歡迎下載,
| ( ??????? ) hi! 我是一朵云 |
鏈接:https://pan.baidu.com/s/1HAMHxc4gOKGSlqzJ-pGA_g
提取碼:sy52
代碼源檔案
| ( ??????? )我想飄到你心里 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295394.html
標籤:java
上一篇:Java垃圾回識訓制(GC)
下一篇:JAVA方法
