林 敏 郝麗娜
(武漢工程職業(yè)技術(shù)學(xué)院 湖北 武漢:430080)
《Java程序設(shè)計》是一門重要的計算機編程課程,是計算機相關(guān)專業(yè)必修課程之一,具有較強的理論性、專業(yè)性和實踐性。目前,本門課程存在教學(xué)內(nèi)容多課時少,教學(xué)方式重理論輕實踐,學(xué)生動手實踐能力和編碼開發(fā)能力較弱的現(xiàn)象,進而可能導(dǎo)致學(xué)生就業(yè)競爭力不強、求職信心受挫。通過調(diào)查發(fā)現(xiàn)不少學(xué)生感到該門課程入門難度較大、內(nèi)容較多、課程學(xué)完了但還是不太會運用。為了解決這一問題,筆者在實踐教學(xué)中采用項目驅(qū)動教學(xué)方式,結(jié)合“1+X”證書制度下的《Java程序設(shè)計》課程教學(xué)改革的要求,以“采用Java實現(xiàn)員工考勤系統(tǒng)”為例,對該課程的實踐教學(xué)進行了設(shè)計與探索,有助于提升該課程的教學(xué)質(zhì)量和教學(xué)效果。
“1+X”證書制度是一套將學(xué)歷教育與職業(yè)培訓(xùn)并重的創(chuàng)新教育制度,其中的“1”代指學(xué)歷證書,“X”代指職業(yè)技能證書。以“大數(shù)據(jù)應(yīng)用開發(fā)(Java)職業(yè)技能”等級證書為例,證書共分為初、中、高三個等級,每一等級均包含理論考試和上機考試兩部分。理論考試為選擇題,上機考試為編程實踐題,同一次考試中兩部分考試成績均達到60分及以上者才能獲得證書。
大數(shù)據(jù)應(yīng)用開發(fā)(Java)職業(yè)技能證書(初級)要求學(xué)生掌握Java開發(fā)環(huán)境搭建、語法基礎(chǔ)、Java面向?qū)ο蟪绦蛟O(shè)計、軟件測試、運維基礎(chǔ)、成本核算方法等,初級對標大數(shù)據(jù)領(lǐng)域的測試工程師。大數(shù)據(jù)應(yīng)用開發(fā)(Java)職業(yè)技能證書(中級)要求學(xué)生掌握Java編程基礎(chǔ)知識和面向?qū)ο箝_發(fā)技術(shù)中的類和對象、方法、封裝、繼承、多態(tài)、接口、集合、反射、JDBC和I/O流操作等知識,同時還需掌握數(shù)據(jù)庫中的增、刪、改、查等知識,能熟練編碼解決數(shù)據(jù)訪問需求等。中級為大數(shù)據(jù)領(lǐng)域的測試工程師和開發(fā)工程師之間的過渡級別。大數(shù)據(jù)應(yīng)用開發(fā)(Java)職業(yè)技能證書(高級)要求學(xué)生除了掌握中級的核心知識點外還需掌握MVC設(shè)計模式、Spring框架(Spring、SpringMVC、SpringBoot)、Hadoop集群環(huán)境搭建、數(shù)據(jù)遷移、數(shù)據(jù)處理、數(shù)據(jù)挖掘常用算法及工具、數(shù)據(jù)可視化等,高級對標大數(shù)據(jù)領(lǐng)域的開發(fā)工程師。
依據(jù)教育部高等職業(yè)學(xué)校軟件技術(shù)專業(yè)教學(xué)標準和軟件技術(shù)專業(yè)人才培養(yǎng)方案,基于Java程序員崗位工作過程,將課程標準與“1+X”證書考核標準對接,以大數(shù)據(jù)應(yīng)用開發(fā)(Java)職業(yè)技能“1+X”證書(中級)的考綱考點要求為例,按照知識、能力與素質(zhì)三方面目標要求(見表1),重建《Java程序設(shè)計》課程實踐教學(xué)內(nèi)容。采用項目驅(qū)動教學(xué)方式,以實際項目為例,培養(yǎng)學(xué)生的動手編程能力、應(yīng)用開發(fā)能力、創(chuàng)新能力和團隊合作能力等。通過項目實踐和“1+X”證書的考試訓(xùn)練過程,促使學(xué)生養(yǎng)成良好的編碼習(xí)慣,提高學(xué)生編程興趣的同時也增強了就業(yè)的內(nèi)動力和競爭力。
表1 知識、能力、素質(zhì)三方面目標
建議實踐項目教學(xué)實施至少安排8學(xué)時,其中教師用2學(xué)時講解項目需求與整體設(shè)計思路,學(xué)生至少需6學(xué)時上機編碼完成項目中的數(shù)據(jù)庫與類設(shè)計、實體類設(shè)計、工具類設(shè)計、實體操作類設(shè)計和測試類設(shè)計等。
以“采用Java實現(xiàn)員工考勤系統(tǒng)”為例,對《Java程序設(shè)計》課程的實踐教學(xué)進行了設(shè)計和探索。
某公司固定上下班時間,規(guī)定每個工作日8點上班17:00下班,并使用傳統(tǒng)指紋打卡機進行員工考勤。在互聯(lián)網(wǎng)迅速發(fā)展的今天,該公司決定使用手機軟件取代傳統(tǒng)指紋打卡機,規(guī)定遲到或早退1分鐘扣x元工資且不設(shè)上限。員工僅可在以(0,0)為圓心,100個單位為半徑的圓形范圍內(nèi)打卡并寫入到employees.txt考勤信息文件中。該項目實現(xiàn)自動統(tǒng)計員工出勤情況及計算員工的實發(fā)工資。
2.2.1 系統(tǒng)功能設(shè)計
系統(tǒng)按照功能分為三部分:
第一部分(讀入數(shù)據(jù)):首先需要將數(shù)據(jù)從文件中讀入,然后由程序存入數(shù)據(jù)庫。具體的操作為將準備好的考勤信息文件employees.txt和員工信息文件records.txt中的數(shù)據(jù)分別存入到數(shù)據(jù)庫中的EMPLOYEES表和RECORDS表。
第二部分(添加數(shù)據(jù)):添加員工信息和考勤記錄。
第三部分(查詢和處理數(shù)據(jù)):查詢員工信息、考勤信息和計算工資。
2.2.2 數(shù)據(jù)庫與類的設(shè)計
為了方便數(shù)據(jù)進入數(shù)據(jù)庫的操作,在Oracle數(shù)據(jù)庫中創(chuàng)建表EMPLOYEES,在Eclipse中創(chuàng)建包,如org.min.bean,在此包下創(chuàng)建Employee.java,定義Employee類,Employee類與EMPLOYEES表相對應(yīng),字段的對應(yīng)關(guān)系見表2。
表2 Employee類與EMPLOYEES表字段對應(yīng)關(guān)系
在Oracle數(shù)據(jù)庫中創(chuàng)建表RECORDS,在Eclipse的org.min.bean包下創(chuàng)建Record.java,定義Record類,Record類與RECORDS表相對應(yīng),字段的對應(yīng)關(guān)系見表3。
表3 Record類與RECORDS表對應(yīng)關(guān)系
整個項目文件包、類文件結(jié)構(gòu)如圖1所示。
圖1 項目結(jié)構(gòu)圖
(1)實體類
實體類有Employee員工信息實體類、EmployeeSalary員工工資實體類和Record考勤記錄實體類。
Employee員工信息實體類中包含員工ID、員工姓名、員工工資及打卡記錄等信息。為增強數(shù)據(jù)安全性,將所有字段訪問屬性設(shè)置為private,然后用get和set方法對各個字段進行封裝。相關(guān)字段如下。
private int id; //員工ID
private String name; //員工姓名
private double salary; //員工工資
private List
EmployeeSalary員工工資實體類中包含員工信息、月份、遲到總時長(單位為分鐘)、早退總時長(單位為分鐘)、實發(fā)工資等信息。為增強數(shù)據(jù)安全性,將所有字段訪問屬性設(shè)置為private,然后用get和set方法對各個字段進行封裝。相關(guān)字段如下。
private Employee employee; //員工信息
private int month; //月份
private int punchIn; //遲到總時長 單位為分鐘
private int punchOut; //早退總時長 單位為分鐘
private double actualSalary; //實發(fā)工資
Record考勤記錄實體類中包含員工號、打卡時間、打卡類型(上班/下班)、打卡位置(橫坐標)、打卡位置(縱坐標)、打卡超時(單位為分鐘)等信息。為增強數(shù)據(jù)安全性,將上述字段訪問屬性設(shè)置為private,然后用get和set方法對各個字段進行封裝。另外,定義了兩個靜態(tài)常量用來設(shè)置打卡的類型,相關(guān)字段如下。
private int employeeId; //員工號
private long recordTime; //打卡時間
private int type; //打卡類型 上班/下班
private double locationX; //打卡位置 橫坐標
private double locationY; //打卡位置 縱坐標
private int outTime; //超時 單位:分鐘
public static final int PUNCH_IN=1; //打卡類型常量:上班打卡
public static final int PUNCH_OUT=2; //打卡類型常量:下班打卡
(2)工具類
工具類中包含EmployeeUtil類、RecordUtil類和IOUtil類
EmployeeUtil類的功能是將讀入的字符串轉(zhuǎn)為Employee對象。該類中定義了一個公有的靜態(tài)的toEmployee方法,實現(xiàn)了將傳入的字符串通過split()函數(shù)分解,然后將分解的字段存入Employee對象中。
RecordUtil類的功能是將讀入的字符串轉(zhuǎn)為Record對象。該類中定義了一個公有的靜態(tài)的toRecord方法,實現(xiàn)將傳入的字符串通過split()函數(shù)分解,然后將分解的字段存入Record對象中。
IOUtil類的設(shè)計中包含兩個方法,一個是readEmployees()方法,其功能是將存有員工信息的文本文件employees.txt通過FileReader文件輸入流順序地讀入,然后調(diào)用工具類EmployeeUtil將讀入的字符串存進Employee對象中,返回Employee對象集合。另一個是readRecords()方法,其功能是將存有員工打卡記錄的文本文件records.txt通過FileReader文件輸入流順序地讀入,然后調(diào)用工具類RecordUtil將讀入的字符串存入Record對象中,返回Record對象集合。方法的定義如下。
public static List
public static List
(3)實體操作類
實體操作類有EmployeeDao類和RecordDao類。
EmployeeDao類主要用來對Employee實體類進行操作,主要功能為:添加一個或多個員工多個員工和查詢某員工某個月的工資信息。方法的定義如下。
public int addEmployee(Employee emp) //添加一個員工
public boolean addAll(List
public EmployeeSalary getEmployeeSalaryById(int employeeId,int year,int month)
//查詢某員工某個月的工資信息
RecordDao類主要用來對Record實體類進行操作,實現(xiàn)了添加一條打卡記錄、批量添加打卡記錄和根據(jù)指定月份查詢某員工的打卡記錄的功能。方法的定義如下。
public int addRecord(Record record) //添加打卡記錄
public boolean addAll(List
public List
(4)測試類
測試類有ConnTest測試類、EmployeeDaoTest測試類和RecordDaoTest測試類。
ConnTest測試類中主要方法有:
public void connTest() //獲取數(shù)據(jù)庫連接測試
EmployeeDaoTest測試類中主要方法有:
EmployeeDaoTest //批量添加員工測試
public void testAddEmployee() //添加一個員工測試
public void testGetEmployeeSalary() //查詢某員工的考勤和工資信息測試
RecordDaoTest測試類中主要方法有:
public void testAddAllRecords() //批量添加打卡記錄測試
public void testAddRecord() //添加一個打卡記錄測試
public void testGetMonthRecordById() //根據(jù)員工ID查詢打卡記錄
(1)讀取文本文件中所有的員工信息
public static List
FileReader fr=null;
BufferedReader br=null;
List
try {
fr=new FileReader (empFilePath);
br=new BufferedReader(fr);
String str;
while((str=br.readLine ())!=null) {
Employee employee=EmployeeUtil.toEmployee(str);
emps.add (employee);
}
} catch (Exception e) {
e.printStackTrace();
}
return emps;
}
(2)查詢某員工某個月的工資信息和考勤記錄
public EmployeeSalary getEmployeeSalaryById(int employeeId,int year,int month) {
String sql="select id,name,salary from EMPLOYEES where id=?";
Employee employee=new ObjectUtil
//查詢考勤記錄
List
employee.setRecords (records);
int punchIn=0;
int punchOut=0;
//統(tǒng)計缺勤時間
for(Record record:records) {
if(record.getType ()==Record.PUNCH_IN) {
punchIn=record.getOutTime();
}else if(record.getType ()==Record.PUNCH_OUT) {
punchOut=record.getOutTime();
}
}
return new EmployeeSalary (employee,month, punchIn, punchOut);
}
通過真實案例的項目教學(xué)實踐,學(xué)生全程參與了項目的需求分析、功能設(shè)計、數(shù)據(jù)庫設(shè)計、實體類設(shè)計、工具類設(shè)計、實體操作類設(shè)計、測試類設(shè)計和編碼等,對項目的開發(fā)流程有了一定的了解,在理論課上所學(xué)的《Java程序設(shè)計》課程的章節(jié)知識點通過項目實踐得到綜合運用,學(xué)生的學(xué)習(xí)積極性和自信心也得到相應(yīng)的提高,進而增強了就業(yè)的內(nèi)動力和競爭力。
武漢工程職業(yè)技術(shù)學(xué)院學(xué)報2020年4期