Spark大數(shù)據(jù)技術(shù)項(xiàng)目實(shí)戰(zhàn) 課件 項(xiàng)目二 使用Scala實(shí)現(xiàn)人事管理系統(tǒng)_第1頁
Spark大數(shù)據(jù)技術(shù)項(xiàng)目實(shí)戰(zhàn) 課件 項(xiàng)目二 使用Scala實(shí)現(xiàn)人事管理系統(tǒng)_第2頁
Spark大數(shù)據(jù)技術(shù)項(xiàng)目實(shí)戰(zhàn) 課件 項(xiàng)目二 使用Scala實(shí)現(xiàn)人事管理系統(tǒng)_第3頁
Spark大數(shù)據(jù)技術(shù)項(xiàng)目實(shí)戰(zhàn) 課件 項(xiàng)目二 使用Scala實(shí)現(xiàn)人事管理系統(tǒng)_第4頁
Spark大數(shù)據(jù)技術(shù)項(xiàng)目實(shí)戰(zhàn) 課件 項(xiàng)目二 使用Scala實(shí)現(xiàn)人事管理系統(tǒng)_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

許斌/0181932025.11.17新開發(fā)使用Scala實(shí)現(xiàn)人事管理系統(tǒng)

學(xué)完本課程后,您將可以:能夠搭建Scala開發(fā)環(huán)境能夠掌握Scala的基本語法能夠使用Scala實(shí)現(xiàn)簡(jiǎn)單編程能夠使用Scala開發(fā)完成案例01搭建Scala開發(fā)環(huán)境02學(xué)習(xí)Scala基本語法03實(shí)現(xiàn)人事管理系統(tǒng)401搭建Scala開發(fā)環(huán)境Scala是什么Scala這一名稱來自“ScalableLanguage”的縮寫,意為“可伸縮的語言”,旨在其可以適應(yīng)不斷變化的編程需求Scala是一種集面向?qū)ο蠛秃瘮?shù)式編程優(yōu)點(diǎn)于一身的現(xiàn)代多范式編程語言Scala語言由馬丁·奧德斯基(MartinOdersky)和他的團(tuán)隊(duì)在2003年開發(fā)Scala=Java+函數(shù)式編程Scala作為一種運(yùn)行在Java虛擬機(jī)(JVM)上的語言,Scala能夠無縫地利用Java的豐富類庫資源Scala的特點(diǎn)面向?qū)ο蠛瘮?shù)式編程靜態(tài)類型擴(kuò)展性兼容性Scala是一種純面向?qū)ο蟮恼Z言,每個(gè)值都是對(duì)象,包括數(shù)字、函數(shù)和數(shù)組。Scala支持高級(jí)的面向?qū)ο筇匦?,如類繼承、抽象類、接口(特質(zhì)Trait)和對(duì)象組合Scala同樣支持函數(shù)式編程范式。它提供了不可變數(shù)據(jù)類型,以及將函數(shù)作為一等公民的能力。這意味著函數(shù)可以被作為參數(shù)傳遞,可以作為結(jié)果返回,以及可以被賦值給變量盡管Scala是靜態(tài)類型的語言,它的類型系統(tǒng)是非常靈活的,支持泛型、類型推導(dǎo)以及復(fù)合類型等。靜態(tài)類型系統(tǒng)在編譯時(shí)期就能夠捕捉到很多錯(cuò)誤,這是動(dòng)態(tài)類型語言難以比擬的Scala的設(shè)計(jì)允許以一種非常自然的方式來擴(kuò)展語言本身。通過隱式轉(zhuǎn)換和宏,用戶可以在不改變語言語法的情況下,引入新的語言結(jié)構(gòu)由于Scala是運(yùn)行在JVM上的,它可以非常容易地與Java代碼和庫進(jìn)行互操作。這為Scala的使用提供了極大的靈活性和強(qiáng)大的生態(tài)系統(tǒng)支持。ScalaScala的這些特點(diǎn)不僅在大數(shù)據(jù)處理領(lǐng)域表現(xiàn)出色,也完美適用于各類通用軟件開發(fā)場(chǎng)景搭建Scala開發(fā)環(huán)境-下載Scala官網(wǎng)下載注意:2.12.x與2.13.x并不兼容,需要獨(dú)立升級(jí)搭建Scala開發(fā)環(huán)境-安裝Scala搭建Scala開發(fā)環(huán)境-安裝Scala搭建Scala開發(fā)環(huán)境-安裝Scala搭建Scala開發(fā)環(huán)境-校驗(yàn)Scala安裝是否正確Win+R搭建Scala開發(fā)環(huán)境-校驗(yàn)Scala安裝是否正確輸入scala命令VSCode運(yùn)行Scala代碼Scala代碼的4種運(yùn)行方式運(yùn)行方式操作步驟適用場(chǎng)景CMD命令行窗口記事本IDE(集成開發(fā)環(huán)境)SBT環(huán)境在命令行工具中輸入“scala”命令以進(jìn)入Scala交互式環(huán)境,隨后可在此環(huán)境中直接輸入并執(zhí)行代碼段適合快速測(cè)試和交互式編程使用文本編輯器新建并編寫Scala代碼,保存為“.scala”文件后,通過執(zhí)行“scalac文件名.scala”進(jìn)行編譯適用于簡(jiǎn)單的代碼編寫和學(xué)習(xí)練習(xí)在VSCode或IDEA等集成開發(fā)環(huán)境中創(chuàng)建Scala項(xiàng)目,編寫代碼后可直接運(yùn)行。對(duì)于需要用戶輸入的情況,只需在運(yùn)行配置中預(yù)先設(shè)定即可適合大型項(xiàng)目開發(fā)和代碼調(diào)試啟動(dòng)命令行工具,輸入“sbtconsole”命令進(jìn)入SBT控制臺(tái),此時(shí)可在此環(huán)境中錄入并執(zhí)行所需的Scala代碼段適用于需要構(gòu)建和管理Scala項(xiàng)目的場(chǎng)合VSCode方式運(yùn)行Scala-下載VSCode官網(wǎng)下載VSCode方式運(yùn)行Scala-安裝VSCodeVSCode方式運(yùn)行Scala-安裝VSCodeVSCode方式運(yùn)行Scala-安裝VSCode插件安裝官方提供的Scala(Metals)插件,該插件支持語法高亮、代碼補(bǔ)全等功能編寫第一個(gè)Scala程序編譯Scala程序執(zhí)行編譯命令:

scalac源文件名.后綴名

注意:Scala源文件編譯后將生成class文件(與Java相同)運(yùn)行Scala程序執(zhí)行運(yùn)行命令:

scalaclass文件名

注意:運(yùn)行scala程序時(shí),不要添加文件后綴名如何編譯和運(yùn)行Scala程序?

Scala與Java之間有關(guān)系嗎?Scala是否可以直接使用Java的SDK庫?

講解了Scala語言簡(jiǎn)介講解了Scala語言特點(diǎn)講解了Scala開發(fā)環(huán)境搭建講解了Scala程序運(yùn)行2402學(xué)習(xí)Scala基本語法基本語法和結(jié)構(gòu)在Scala中,import語句用于將類、接口、對(duì)象或方法從其他包引入到當(dāng)前代碼文件中包導(dǎo)入在Scala中,可以使用var和val來聲明變量變量聲明函數(shù)定義的基本格式是deffunctionName(parameters):函數(shù)定義Scala中的for循環(huán)非常強(qiáng)大,它可以用作傳統(tǒng)的迭代循環(huán),也可以用于操作集合或序列的元素循環(huán)Scala程序的入口點(diǎn)是定義為main的方法主函數(shù)Scala中的if-else結(jié)構(gòu)與Java非常相似,但Scala提供了更豐富的表達(dá)式語法條件語句數(shù)據(jù)類型與操作-類型別名importscala.collection.immutableobjectDataTypesAndOperationsExample{//類型別名typeStudentGrades=immutable.Map[String,Double]...}它提供了一種方式來給復(fù)雜的類型命名,以提高代碼的可讀性和易用性類型別名typeStudentGrades=Map[String,Double]定義了一個(gè)類型別名StudentGrades,它簡(jiǎn)化了Map[String,Double]的表示,使代碼更加清晰數(shù)據(jù)類型與操作-字符串插值defmain(args:Array[String]):Unit={//字符串插值valschoolName="Scala高中"println(s"歡迎來到$schoolName!")}通過字符串插值可以方便地構(gòu)造字符串,允許在字符串文字中嵌入表達(dá)式的值字符串插值s插值器(s"..."):用于簡(jiǎn)單的情形,其中字符串文字中的表達(dá)式被替換為它們的字符串表示形式Scala提供兩種主要的插值器f插值器(f"..."):用于格式化字符串,可以指定格式選項(xiàng),比如浮點(diǎn)數(shù)的精度等數(shù)據(jù)類型與操作-Map集合defmain(args:Array[String]):Unit={

//集合(Map)和類型推斷valgrades:StudentGrades=immutable.Map("Alice"->95.5,"Bob"->87.0,"Charlie"->92.5)}Scala中的Map是一個(gè)鍵值對(duì)集合,其中每個(gè)鍵都關(guān)聯(lián)一個(gè)值Map集合使用immutable.Map創(chuàng)建了一個(gè)不可變集合來存儲(chǔ)學(xué)生的名字和成績(jī)。通過“->”操作符添加元素到集合中,對(duì)于不可變Map,可以使用“+”操作符創(chuàng)建一個(gè)包含新元素的新Map。對(duì)于可變Map,可通過“+=”操作符更新Map數(shù)據(jù)類型與操作-類型推斷defmain(args:Array[String]):Unit={

//計(jì)算平均成績(jī)valaverageGrade=grades.values.sum/grades.sizeprintln(f"班級(jí)平均成績(jī)是:$averageGrade%.2f")}在Scala中如果未顯式聲明變量的類型,編譯器會(huì)自動(dòng)推斷出最合適的類型類型推斷在代碼中,雖然未明確聲明averageGrade的類型,但Scala編譯器根據(jù)其值自動(dòng)推斷出它是Double類型面向?qū)ο缶幊?類與對(duì)象(普通類)普通類//普通類classEmployee(privatevar_name:String,privatevar_salary:Double){//封裝:使用私有字段和公共方法defname:String=_namedefsalary:Double=_salarydefsalary_=(newSalary:Double):Unit={if(newSalary>0)_salary=newSalary}}Scala普通類定義比Java更簡(jiǎn)潔,成員變量可直接聲明在類體中,無需顯式構(gòu)造器賦值普通類面向?qū)ο缶幊?類與對(duì)象(單例對(duì)象)單例對(duì)象//單例對(duì)象objectHRSystem{privatevalemployees=scala.collection.mutable.ArrayBuffer[Employee]()defaddEmployee(employee:Employee):Unit={employees+=employee}defprintAllEmployees():Unit={employees.foreach(println)}}在Scala中,單例對(duì)象是只初始化一次的單例模式實(shí)例單例對(duì)象面向?qū)ο缶幊?類與對(duì)象(caseclass)caseclass//caseclasscaseclassDepartment(name:String,head:Employee)用于創(chuàng)建不可變的數(shù)據(jù)結(jié)構(gòu),通常用于模式匹配caseclass面向?qū)ο缶幊?封裝(私有字段與公共方法)私有字段//私有字段classEmployee(privatevar_name:String,privatevar_salary:Double){...}用于創(chuàng)建不可變的數(shù)據(jù)結(jié)構(gòu),通常用于模式匹配私有字段在scala中所有方法默認(rèn)為公共方法,可在任何位置訪問公共方法公共方法//公共方法defsalary_=(newSalary:Double):Unit={if(newSalary>0)_salary=newSalary}面向?qū)ο缶幊?方法重載方法重載//方法重載

defpromote(amount:Double):Unit={salary+=amount}defpromote(percentage:Int):Unit={salary*=(1+percentage/100.0)}即同一個(gè)方法名可以根據(jù)傳入?yún)?shù)的不同(Double類型或Int類型),執(zhí)行不同的邏輯方法重載面向?qū)ο缶幊?命名約定命名約定小駝峰命名法大駝峰命名法用于方法和變量名(如addEmployee,printAllEmployees),除了第一個(gè)單詞外,每個(gè)單詞的首字母都大寫用于類名(如Employee,Department),每個(gè)單詞的首字母都大寫,不使用下劃線面向?qū)ο缶幊?擴(kuò)展說明caseclass特性可變與不可變集合與普通類相比,caseclass自動(dòng)具備一些功能,如模式匹配、自動(dòng)生成的toString方法等在HRSystem中使用了可變的ArrayBuffer來存儲(chǔ)雇員,這在多線程環(huán)境下可能會(huì)導(dǎo)致問題。對(duì)于并發(fā)程序設(shè)計(jì),推薦使用不可變集合函數(shù)式編程-模式匹配類似于Java中的swichcase語法,即對(duì)一個(gè)值進(jìn)行條件判斷,然后針對(duì)不同的條件,執(zhí)行相應(yīng)的操作模式匹配模式匹配//模式匹配

defdescribeBook(book:Book):String=bookmatch{caseBook(_,title,"MartinOdersky",_)=>s"《$title》是Scala的創(chuàng)始人編寫的書"caseBook(_,title,author,price)ifprice>40=>s"《$title》是一本昂貴的書,作者是$author"caseBook(_,title,author,_)=>s"《$title》的作者是$author"}函數(shù)式編程-Option和EitherOption類型是函數(shù)式編程中處理可能的空值的一種方式。它有兩種形式:Some(value)表示存在值,而None表示不存在值。這避免了直接使用null,從而減少了空指針異常的風(fēng)險(xiǎn)OptionEither類型用于表示操作的兩種可能結(jié)果:右側(cè)(Right)通常表示成功的結(jié)果,而左側(cè)(Left)表示某種形式的失敗或錯(cuò)誤EitherOption與Either區(qū)別Scala中Either和Option是兩種用于處理可能缺失或失敗結(jié)果的類型,但它們的設(shè)計(jì)目的和使用場(chǎng)景有顯著區(qū)別Opiton用于處理可能為空的值(僅區(qū)分存在與否,不提供錯(cuò)誤信息);Either用于處理可能失敗的操作(Left通常承載錯(cuò)誤信息,Right表示成功結(jié)果)函數(shù)式編程-不可變性Scala的不可變性是指一旦創(chuàng)建集合(如List、Vector等),其元素和結(jié)構(gòu)無法被修改,任何操作都會(huì)返回新的集合實(shí)例(這種設(shè)計(jì)提升了線程安全性和函數(shù)式編程的友好性)不可變性核心特性線程安全:不可變集合無需同步機(jī)制,多個(gè)線程可安全共享引用函數(shù)式友好:支持鏈?zhǔn)讲僮髑也划a(chǎn)生副作用,符合純函數(shù)原則持久化數(shù)據(jù)結(jié)構(gòu):通過共享節(jié)點(diǎn)優(yōu)化內(nèi)存使用,修改操作僅生成新實(shí)例函數(shù)式編程-不可變性Scala鼓勵(lì)使用不可變數(shù)據(jù)結(jié)構(gòu)和純函數(shù)式操作,以增強(qiáng)代碼的線程安全性、可測(cè)試性和可維護(hù)性使用caseclass定義不可變的類使用不可變的Map存儲(chǔ)數(shù)據(jù)使用函數(shù)式操作處理數(shù)據(jù)caseclass自動(dòng)為它的字段生成了一些有用的方法(如equals、hashCode和toString),并且它是不可變的,意味著一旦創(chuàng)建,其狀態(tài)就不能被修改與可變的HashMap不同,Scala中的Map默認(rèn)是不可變的,這意味著一旦創(chuàng)建,就不能添加或刪除元素。這鼓勵(lì)了純粹的函數(shù)式操作,避免了副作用通過使用filter、map、sum等高階函數(shù),可以對(duì)集合進(jìn)行復(fù)雜的操作,而不需要改變?cè)紨?shù)據(jù)。這種操作方式避免了直接修改數(shù)據(jù),使得代碼更加清晰且易于理解和維護(hù)控制臺(tái)輸入與輸出控制臺(tái)輸入輸出是指通過標(biāo)準(zhǔn)輸入(stdin)從用戶那里讀取數(shù)據(jù),以及通過標(biāo)準(zhǔn)輸出(stdout)向用戶顯示信息的過程輸入函數(shù):StdIn.readInt()輸出函數(shù):println(...)和print(...)它是Scala的一個(gè)標(biāo)準(zhǔn)輸入函數(shù),用于從控制臺(tái)讀取用戶輸入的整數(shù)。如果用戶輸入的不是一個(gè)有效的整數(shù),那么這個(gè)函數(shù)會(huì)拋出一個(gè)異常。是Scala的標(biāo)準(zhǔn)輸出函數(shù),分別用于打印字符串并在末尾添加換行符以及打印字符串但不添加換行符。在這個(gè)例子中,它們被用來向用戶展示信息或者提示文件輸入與輸出文件輸入輸出是指程序與外部文件系統(tǒng)進(jìn)行數(shù)據(jù)交換的過程,包括從文件讀取數(shù)據(jù)(輸入)和向文件寫入數(shù)據(jù)(輸出)輸入函數(shù):PrintWriter()輸出函數(shù):scala.io.Source它是Java的一個(gè)類,用于將文本寫入文件它是Scala的一個(gè)類,用于從文件中讀取文本錯(cuò)誤處理-EitherScala中使用Either[A,B]類型來表示可能失敗的操作結(jié)果的方法,其中Left表示錯(cuò)誤信息,Right表示成功結(jié)果,允許以函數(shù)式和類型安全的方式處理和傳播錯(cuò)誤valwriteResult=writeToFile(filename,content)writeResultmatch{caseRight(_)=>println("文件寫入成功。")caseLeft(error)=>println(s"文件寫入錯(cuò)誤:$error")}異常處理異常處理是用于捕獲、處理和管理程序執(zhí)行過程中可能發(fā)生的異常情況或錯(cuò)誤,以確保程序能夠優(yōu)雅地響應(yīng)并從這些異常中恢復(fù),而不是突然終止defreadFromFile(filename:String):Either[String,String]={try{valsource=scala.io.Source.fromFile(filename)try{Right(source.mkString)}finally{source.close()}}match{caseSuccess(content)=>contentcaseFailure(e)=>Left(s"讀取文件失敗:${e.getMessage}")}}高級(jí)特性-泛型泛型是一種允許在定義類、接口和方法時(shí)使用類型參數(shù)的編程技術(shù),使得代碼可以獨(dú)立于具體的數(shù)據(jù)類型而工作泛型泛型//泛型特質(zhì)(類型類)traitPrintable[A]{defformat(value:A):String}//泛型類caseclassBox[A](value:A)高級(jí)特性-隱式轉(zhuǎn)換和隱式類隱式轉(zhuǎn)換和隱式類是Scala中的特性,允許編譯器自動(dòng)應(yīng)用某些轉(zhuǎn)換或添加方法到現(xiàn)有類型,以增強(qiáng)代碼的靈活性和表達(dá)能力隱式轉(zhuǎn)換和隱式類隱式轉(zhuǎn)換和隱式類//隱式類(用于擴(kuò)展方法)implicitclassPrintableOps[A](value:A){defformat(implicitp:Printable[A]):String=p.format(value)}//隱式轉(zhuǎn)換implicitdefboxToValue[A](box:Box[A]):A=box.value高級(jí)特性-類型類類型類是一種設(shè)計(jì)模式,允許在不修改原有代碼的情況下,為不同類型添加新的行為或接口類型類類型類//隱式值(類型類實(shí)例)implicitvalintPrintable:Printable[Int]=newPrintable[Int]{defformat(value:Int):String=s"Int:$value"}高級(jí)特性-高階函數(shù)高階函數(shù)是可以接受其他函數(shù)作為參數(shù)或返回函數(shù)的函數(shù),增加了代碼的抽象能力和靈活性高階函數(shù)高階函數(shù)//高階函數(shù)deftwice[A](f:A=>A):A=>A=x=>f(f(x))//使用高階函數(shù)valdouble:Int=>Int=x=>x*2valquadruple=twice(double)println(s"4的4倍:${quadruple(4)}")//輸出:4的4倍:16高級(jí)特性-柯里化柯里化是將接受多個(gè)參數(shù)的函數(shù)轉(zhuǎn)換為一系列接受單個(gè)參數(shù)的函數(shù)的技術(shù)柯里化柯里化//柯里化defadd(x:Int)(y:Int):Int=x+y//使用柯里化valadd5=add(5)_println(s"5+3=${add5(3)}")//輸出:5+3=8高級(jí)特性-偏函數(shù)偏函數(shù)是只對(duì)其定義域的一個(gè)子集有定義的函數(shù),允許更精確地控制函數(shù)的應(yīng)用條件偏函數(shù)偏函數(shù)//偏函數(shù)valdivide:PartialFunction[Int,Int]={casedifd!=0=>100/d}println(s"100/4=${divide(4)}")//輸出:100/4=25println(s"是否定義了100/0:${divide.isDefinedAt(0)}")高級(jí)特性-尾遞歸優(yōu)化尾遞歸優(yōu)化是編譯器將尾遞歸函數(shù)轉(zhuǎn)換為迭代形式的技術(shù),避免了棧溢出的風(fēng)險(xiǎn),使遞歸更加高效尾遞歸優(yōu)化尾遞歸優(yōu)化//尾遞歸優(yōu)化@scala.annotation.tailrecdeffactorial(n:Int,acc:BigInt=1):BigInt={if(n<=1)accelsefactorial(n-1,n*acc)}println(s"10的階乘:${factorial(10)}")//輸出:10的階乘:3628800(單選)Scala程序的主函數(shù)正確的定義格式是?(

)defmain():Unit={}defmain(args:Array[String]):Unit={}publicstaticvoidmain(String[]args)functionmain(args){}

Scala中如何實(shí)現(xiàn)單例設(shè)計(jì)模式?講解了Scala語言的基本語法與結(jié)構(gòu)講解了Scala語言的數(shù)據(jù)類型與操作講解了Scala語言的面向?qū)ο缶幊讨v解了Scala語言的函數(shù)式編程講解了Scala語言的輸入輸出和異常處理講解了Scala語言的高級(jí)特性5503實(shí)現(xiàn)人事管理系統(tǒng)人事管理系統(tǒng)需求介紹56薪資管理模塊人事管理機(jī)系統(tǒng)員工信息管理模塊提供員工信息管理,支持新增、刪除、修改和查詢員工基本信息,包括姓名、工號(hào)和職位。同時(shí),系統(tǒng)也管理員工的薪資數(shù)據(jù),包括基本工資、獎(jiǎng)金和扣款等,確保數(shù)據(jù)的準(zhǔn)確性,以支持人力資源決策具備智能化的薪資管理,可以根據(jù)員工的基本工資、獎(jiǎng)金和扣款計(jì)算最終的薪資。通過薪資管理模塊,可以自動(dòng)計(jì)算薪資,保證薪資計(jì)算的準(zhǔn)確性、公正性和合規(guī)性,有效執(zhí)行和調(diào)整企業(yè)薪資政策系統(tǒng)架構(gòu)與技術(shù)設(shè)計(jì)員工類(Employee)人事管理系統(tǒng)類(HRSystem)主函數(shù)(Mainobject)人事管理系統(tǒng)系統(tǒng)架構(gòu)與技術(shù)設(shè)計(jì)-員工類(Employee)

員工類(caseclass

Employee)員工ID:String姓名:String職位:String薪資:Double系統(tǒng)架構(gòu)與技術(shù)設(shè)計(jì)-人事管理系統(tǒng)類(HRSystem)

人事管理系統(tǒng)類(class

HRSystem)員工映射表:mutable.MapaddEmployee(employee:Employee):添加員工信息deleteEmployee(id:String):根據(jù)ID刪除員工記錄updateEmployee(employee:Employee):更新或新增員工信息getEmployee(id:String):通過ID獲取員工信息calculateSalary(id:String,bonus:Double,deduction:Double):計(jì)算指定員工在獎(jiǎng)金和扣款影響下的薪資系統(tǒng)架構(gòu)與技術(shù)設(shè)計(jì)-主函數(shù)(Mainobject)

主函數(shù)(Mainobject)作為程序入口,通過無限循環(huán)與用戶交互展示操作菜單,根據(jù)用戶輸入調(diào)用HRSystem相應(yīng)方法支持添加、刪除、修改、查詢員工信息,計(jì)算薪資以及退出系統(tǒng)使用match語句處理用戶選擇,確保輸入的有效性,對(duì)于無效的操作將會(huì)提示用戶重新輸入,提升用戶體驗(yàn)需求功能實(shí)現(xiàn)-定義員工類(Employee)//定義員工類

caseclassEmployee(id:String,name:String,position:String,salary:Double)需求功能實(shí)現(xiàn)-創(chuàng)建人事管理系統(tǒng)類(HRSystem)classHRSystem{privatevalemployees=mutable.Map[String,Employee]()

//...各種方法...}需求功能實(shí)現(xiàn)-定義人事管理類方法//添加員工defaddEmployee(employee:Employee):Unit={employees(employee.id)=employee}//刪除員工defdeleteEmployee(id:String):Unit={employees.remove(id)}64//修改員工信息defupdateEmployee(employee:Employee):Unit={employees(employee.id)=employee}//查詢員工信息defgetEmployee(id:String):Option[Employee]={employees.get(id)}65//計(jì)算薪資defcalculateSalary(id:String,bonus:Double,deduction:Double):Option[Double]={employees.get(id).map(e=>e.salary+bonus-deduction)}需求功能實(shí)現(xiàn)-編寫主函數(shù)objectMain{defmain(args:Array[String]):Unit={//...與用戶交互邏輯...}}在main方法內(nèi),需要實(shí)現(xiàn)的邏輯如下:初始化一個(gè)HRSystem實(shí)例hrSystem,用于處理人事管理操作設(shè)立一個(gè)布爾變量running,初始值為true,用于控制循環(huán)是否繼續(xù)在循環(huán)內(nèi)部,展示操作菜單供用戶選擇,如“1.添加員工”,“2.刪除員工”等讀取用戶輸入的整數(shù)(代表所選操作),并使用match語句根據(jù)用戶選擇調(diào)用相應(yīng)的方法需求功能實(shí)現(xiàn)-編寫主函數(shù)valhrSystem=newHRSystem()varrunning=truewhile(running){println("請(qǐng)輸入操作:1.添加員工2.刪除員工3.修改員工4.查詢員工5.計(jì)算薪資6.退出")valoperation=scala.io.StdIn.readInt()operationmatch{case1=>

68println("請(qǐng)輸入員工ID、姓名、職位和薪資:")valid=scala.io.StdIn.readLine()valname=scala.io.StdIn.readLine()valposition=scala.io.StdIn.readLine()valsalary=scala.io.StdIn.readDouble()hrSystem.addEmployee(Employee(id,name,position,salary))case2=>println("請(qǐng)輸入員工ID:")

69valid=scala.io.StdIn.readLine()hrSystem.deleteEmployee(id)case3=>println("請(qǐng)輸入員工ID、姓名、職位和薪資:")編譯代碼終端輸入

scalac*.scala

命令,編譯所有scala源文件運(yùn)行代碼終端輸入

scalaMain

命令,運(yùn)行Main程序代碼優(yōu)化代碼優(yōu)化防止數(shù)據(jù)沖突與冗余提升用戶體驗(yàn)與程序反饋清晰度增強(qiáng)數(shù)據(jù)輸入有效性與程序健壯性代碼優(yōu)化-防止數(shù)據(jù)沖突與冗余在添加或更新員工信息時(shí),若不檢查ID是否存在并詢問用戶是否覆蓋,可能導(dǎo)致同一ID對(duì)應(yīng)多條數(shù)據(jù)(更新時(shí))或重復(fù)記錄(添加時(shí))。通過提示并確認(rèn),可確保數(shù)據(jù)一致性,避免信息混亂,修改代碼如下://添加員工defaddEmployee(employee:Employee):Unit={

if(employees.contains(employee.id)){//這里可以詢問用戶是否要更新println(s"員工ID為${employee.id}的員工已存在,是否要更新?")}else{employees(employee.id)=employee}}74//修改員工信息defupdateEmployee(employee:Employee):Unit={

if(!employees.contains(employee.id)){println(s"員工ID為${employee.id}的員工不存在.")}else{employees(employee.id)=employee}}代碼優(yōu)化-提升用戶體驗(yàn)與程序反饋清晰度

當(dāng)查詢或計(jì)算薪資涉及的員工ID不存在時(shí),直接返回“None”對(duì)用戶而言可能難以理解。提供明確的錯(cuò)誤信息,如“員工ID未找到”,有助于用戶快速識(shí)別問題所在,提高系統(tǒng)易用性及交互友好度。修改后的代碼如下://查詢員工信息defgetEmployee(id:String):Either[String,Employee]={

employees.get(id)match{caseSome(employee)=>Right(employee)caseNone=>Left(s"員工ID為$id的員工不存在.")}}76//計(jì)算薪資defcalculateSalary(id:String,bonus:Double,deduction:Double):Either[String,Double]={

employees.get(id)match{caseSome(employee)=>Right(employee.salary+bonus-deduction)caseNone=>Left(s"員工ID為$id的員工不存在.")}}代碼優(yōu)化-增強(qiáng)數(shù)據(jù)輸入有效性與程序健壯性

當(dāng)查詢或計(jì)算薪資涉及的員工ID不存在時(shí),直接返回“None”對(duì)用戶而言可能難以理解。提供明確的錯(cuò)誤信息,如“員工ID未找到”,有助于用戶快速識(shí)別問題所在,提高系統(tǒng)易用性及交互友好度。修改前后的代碼對(duì)比如下:valoperation=scala.io.StdIn.readInt()operationmatch{case1=> ...valsalary=scala.io.StdIn.readDouble()hrSystem.addEmployee(Employee(id,name,position,salary))valoperation=scala.io.StdIn.readInt()operationmatch{case1=>...valsalary=scala.io.StdIn.readDouble()

if(salary<0){println("薪資必須是非負(fù)數(shù).")}else{hrSystem.addEmployee(Employee(id,name,position,salary))}修改前修改后代碼優(yōu)化-提升用戶體驗(yàn)與程序反饋清晰度

valoperation=scala.io.StdIn.readInt()operationmatch{...case3=>println("請(qǐng)輸入員工ID、姓名、職位和薪資:")valid=scala.io.StdIn.readLine()valname=scala.io.StdIn.readLine()valposition=scala.io.StdIn.readLine()valsalary=scala.io.StdIn.readDouble()hrSystem.updateEmployee(Employee(id,name,position,salary))valoperation=scala.io.StdIn.readInt()operationmatch{...case3=>println("請(qǐng)輸入員工ID、姓名、職位和薪資:")valid=scala.io.StdIn.readLine()valname=scala.io.StdIn.readLine()valposition=scala.io.StdIn.readLine()valsalary=scala.io.StdIn.readDouble()

if(salary<0){println("薪資必須是非負(fù)數(shù).")}else{hrSystem.updateEmployee(Emp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論