面向對象程序設計——UML分析和本學期總結

? 隨著第四單元UML第二次作業的結束,本學期的OO學習也宣告結束了(但還得寫博客),下面就對本單元和本次作業做一個總結。

第四單元兩次作業的架構設計

? 本單元是對UML的結構進行解析,第一次作業是對UML類圖的解析,主要的難度是UML各種元素之間較為復雜的從屬以及其他關系。我的類圖設計如下:

? 我自己創建了ClassModel類來統領兩個子類ClassClass和InterfaceClass,分別代表類和接口,其中實現了添加、儲存、處理類和接口的各種下設參數的方法和變量,讓類和接口的類繼承同一個父類非常重要,因為類和接口有很多相似的地方,再進行輸入處理時也有很多不易區分也不用區分是類還是接口的情況,所以這樣處理極大地方便了程序對這兩個類地儲存和管理。對于方法我創建了OperationClass來添加儲存和管理方法的各種屬性,然后ClassClass和InterfaceClass就只用儲存和管理OperationClass即可,對于其他的屬性由于沒有更多的層次,所以就直接使用接口提供的UML類來進行儲存和管理即可。

? 在進行輸入處理的過程中,由于其結構的層次性,應該將各種屬性的UML_ELEMENT分批來處理,我首先識別處理了UML_CLASS,UML_INTERFACE,UML_OPERATION, UML_ASSSOCIATION_END, 之后再將剩余的其他屬性進行識別處理,這樣再識別時就可以直接建立起各種元素之間的邏輯結構。在儲存中我主要使用了HashMap結構,進行從id到類,從name到類等的映射。

? 對于各種指令的處理方法,有難度的主要分為兩類,一個是需要考慮關聯關系的指令,對它的處理比較直接,在每個ClassModel類中均有其關聯的類或接口的引用,直接訪問即可得到所需要的信息。更復雜的是需要考慮繼承關系和實現關系的指令,對于繼承關系需要考慮多重的繼承,所以我們使用遞歸來處理,其中Information類就是創建用來在遞歸時在類與類、接口與接口之間傳遞信息的,我們任意從某一個類開始,逐層向上,利用遞歸來實現與繼承和實現有關信息的統計,儲存在information里,再逐層向下傳遞。一次遞歸結束后,再找一個沒有經歷過遞歸的類開始遞歸,直到所有地類和接口都經歷過一次遞歸為止。

? 第二次作業在第一次作業的基礎上增加了狀態圖和順序圖的解析,以及對類圖合法性的判斷。在這里要感謝老師和助教們手下留情,最后一次作業的難度要比我想象中簡單很多,特別是最后加了很多數據限制以后,整個問題變得很簡單。

? 整體架構如上,對于順序圖建立一個Interation類來儲存和管理對應的信息,對于狀態圖類建立一個StateMachine類來儲存和管理對應的信息,相比類圖簡單很多,想法也很自然。

? 那么本次的難點主要在于類圖合法性的檢查,類似對類圖的處理,我們按照層次順序依次識別和建立各元素之間的關系,但不需要用到其他的類,只需要根據要求按照id和name建立關系即可。第一個檢查較為簡單,只需要遍歷查看attribute和Association End有沒有重復即可。對于第二三個檢查,先將類繼承,類實現接口,接口繼承形成一張id為結點的有向圖,那么第二個檢查就是在有向圖中找圈,具體地可以使用強連通分量等算法,但由于這里點比較少,所以我們對每個點跑一遍較為樸素的每個點只可到達一次的dfs即可,若可以回到本點,則將該點加入異常結果中。對于第三個檢查,在第二個檢查檢查已經無圈的情況下,找任意兩點之間有沒有多于一條路經可以到達的情況,若有,那么起始的點就重復繼承,具體地同樣也是對每個點使用較為樸素地dfs,若在dfs中訪問了某個點兩次,那么這個起始點就加入到異常結果中。

四個單元中架構設計及OO方法理解的演進

? 在最開始的第一個單元,明顯地自己仍然是面向過程的思維,當時應用熟練的只是Java的語法,而不是Java面向對象的思想,第一單元的第一次作業好像就只使用了一個類來完成了所有的事情,在第二次作業中讓自己多分出了幾個類,但仍然不夠靈活和自然,更多的是為了劃分而劃分。

? 到了第二個單元,有了前面一個單元三次作業的練習,自己有所進步,開始從面向對象的思路開始思考,自己所處理的問題有哪些對象可以使用,他們之間又有哪些關系,但第二單元的重點我認為是在線程的設計和處理上,根據線程的理論,類的劃分也就比較自然,但也是讓我感受到了面向對象的便利。

? 在第三單元之中,是根據JML來寫代碼,更多地是在助教們設計好的架構下來補充代碼,雖然沒有太多的自己的設計,但這也是一個學習的過程。到了第四單元,對面向對象的理解應該已經有了比較高的進步了,可以從問題涉及的對象入手來分析問題,可以很自然地想到一個比較好的架構,并實現它。

四個單元中測試理解與實踐的演進

? 第一個單元最開始自己測試的方法還是比較原始,主要是自己手動構造一些邊際數據來進行測試,肉眼來看結果的正確性。在后面由于表達式難度的加大,肉眼很難分辨正確與否,所以我和幾位同學一起用python來對拍,答案相同則認為正確。

? 第二個單元是多線程,在第一次作業中我吃了手動輸入的虧,由于自己手動輸入的速度太慢,所以基本上不會造成線程安全問題,所以隱藏了很多問題。所以之后我使用了bash批處理和Python來實現了自動生成輸入,自動按時輸入和檢查輸出的合法性,大大加快了檢查效率,也使得在互測中方便了很多。

? 第三個單元中引入了JML,開始我還是使用自動數據生成和多個程序對拍的方法,之后也嘗試了利用JML自動生成數據并自動測試,但總有一些bug,所以最后嘗試使用了樸素的Junit單元測試,還是比較方便的。

? 第四個單元是UML的解析,由于數據不易生成,所以測試主要是利用starUML來生成一些邊界性的數據進行測試,也由于UML的結構相對比較固定,所以還較為方便。

? 總的來說,測試是程序設計過程中一個非常重要的環節。經過四個單元,我認為測試最好的方法就是使用Junit對沒個小單元進行功能測試,但實踐中由于自己類和方法的設計問題以及時間問題,比較難以實施。同時自動化測試尤其是壓力測試對測試也是一個必須的過程。

課程收獲

? 最大的收獲當然是面向程序的設計思想,面向對象提供給了我們一個程序設計的高效思路,使得我們的程序層次化架構更加清晰,代碼重用更加便利,加快了程序設計速度,提高了程序設計效率。豐富了我之前單一的面向過程的變成思想,展現了編程更多的可能性。

? 在這個過程中自己的代碼能力也有了很大的提升,也是第一次擁有了工程性的想法和思維。還學習到了多線程的程序設計,了解了Java較為底層的實現,對Java有了更深的理解。也學習到了規格化的設計,JML語言,UML建模語言等。

? 另外,在這個過程中,自己分析問題的能力,測試的能力,debug的能力也有很大的提升,也是對自己的抗壓能力,面對較大規模編碼的能力的提升。

課程改進建議

- 希望改進一下課上測試的形式和方法,至少找時間講解一下課上的題目或給出參考性答案,否則我們在課上測試中得到的收獲很少。
- JML部分課程組或許可以再進行一些探索和優化,刪去一些難以實現的部分,增添一些更為實際的要求。
- 希望可以改進一下課堂使用的ppt,個人認為課堂ppt的邏輯普遍有一些混亂,結構不是非常的清晰,常常有一些重復等。另外,截圖也經常看不清楚。

轉載于:https://www.cnblogs.com/yhhhz/p/11078284.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386585.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker linux k8s kubeadm

一. 安裝docker 1.添加yum國內依賴 yum -y install yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.安裝docker yum -y install docker-ce docker-ce-cli containerd.io3.啟動docker systemctl start docker4…

小程序FMP優化實錄,大廠面試題匯總

前言 金九銀十面試季,相信大家肯定急需一套Android面試寶典,今天小編就給大家準備了我珍藏已久的Android高階面試寶典,一份超級詳細的Android面試必備知識點,供大家學習 ! 想必每一個安卓程序員都有追求大廠的決心&a…

文件CRC和MD5校驗

文件CRC和MD5校驗 CRC和MD5用于文件和數據的傳輸校驗,以確認是否接收成功。 unit CRCMD5;interface { 獲取文件CRC校驗碼 } function GetFileCRC(const iFileName: string): String; { 獲取字符串CRC校驗碼 } function GetStringCRC(const Str: string): Cardinal; …

Oracle字符分隔函數(split)

為了讓 PL/SQL 函數返回數據的多個行,必須通過返回一個 REF CURSOR 或一個數據集合來完成。REF CURSOR 的這種情況局限于可以從查詢中選擇的數據,而整個集合在可以返回前,必須進行具體化。Oracle 9i 通過引入的管道化表函數糾正了后一種情況。…

已成功拿下字節、騰訊、脈脈offer,吐血整理

為什么想跳槽? 簡單說一下當時的狀況,我在這家公司做了兩年多,這兩年多完成了一個大項目,作為開發的核心主力,開發壓力很大,特別是項目上線前的幾個月是非常辛苦,幾乎每晚都要加班到12點以后&a…

復雜HTML解析

#再端一碗BeautifulSoup #獲取《戰爭與和平》中的人物名字from urllib.request import urlopen from bs4 import BeautifulSouphtml urlopen("http://www.pythonscraping.com/pages/warandpeace.html") bsObj BeautifulSoup(html,html.parser)#namelist bsObj.fin…

java main方法里調用mapper

在main方法中調用mybatis的mapper,一次性執行導入數據功能package com.runxsoft.test;import com.runxsoft.iutils.common.utils.UserUtils; import com.runxsoft.superwe.base.SqlVo; import com.runxsoft.superwe.base.mapper.ProtogenesisMapper; import com.run…

已成功拿下字節、騰訊、脈脈offer,滿滿干貨指導

開頭 籠統來說,中年程序員容易被淘汰的原因其實不外乎三點。 1、輸出能力已到頂點。這個人奮斗十來年了,依舊碌碌無為,很明顯這人的天花板就這樣了,說白了,天賦就這樣。 2、適應能力越來越差。年紀大,有家…

ServletRequest HttpServletRequest 請求方法 獲取請求參數 請求轉發 請求包含 請求轉發與重定向區別 獲取請求頭字段...

原文地址:ServletRequest HttpServletRequest 請求方法 獲取請求參數 請求轉發 請求包含 請求轉發與重定向區別 獲取請求頭字段ServletRequest 基本概念 JavaWeb中的 "Request"對象 實際為 HttpServletRequest 或者 ServletRequest, 兩者都為接口服務器接收請求…

c#掃描圖片去黑邊(掃描儀去黑邊)

/// <summary> /// 自動去除圖像掃描黑邊 /// </summary> /// <param name"fileName"></param> public static void AutoCutBlackEdge(string fileName) { //打開圖像 Bit…

已成功拿下字節、騰訊、脈脈offer,算法太TM重要了

一、背景介紹 從實用角度梳理一篇能夠幫大家快速掃盲的CMake基礎教程&#xff0c;也是對我目前負責項目的一次學習總結。既然選擇從項目實用性考慮&#xff0c;下面的講解內容可能并不一定完整&#xff0c;更多的是符合項目目前使用到的一些特性。 接下來正面回答這個問題&am…

SpringBoot2.0 Actuator 監控參數說明

主要內容更 監控參數說明 Maven坐標 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer</groupId>&…

帶你一步一步深入Handler源碼,醍醐灌頂!

開頭 最近有粉絲反應&#xff0c;不想做安卓了&#xff0c;有朋友轉到前端了&#xff0c;安卓不行了&#xff0c;問我怎么辦&#xff1f; 自從RN&#xff0c;Weex這種跨平臺編程語言出來以后&#xff0c;安卓將死的言論總是不絕于耳。隨著頗有摧枯拉朽之勢Flutter的出現&…

Spring基于狀態機squirrel-foundation簡單使用

squirrel-foundation的一些使用方法在百度上資料還是比較少&#xff0c;我是根據以下三個大佬寫的文章借鑒的&#xff0c;在這里記錄一下。 1、squirrel-foundation-demo 2、Squirrel使用&#xff08;中文文檔&#xff09; 3、squirrel-foundation狀態機的使用細節 我在這里直接…

記得把每一次面試當做經驗積累,深夜思考

開頭 Android開發&#xff0c;假如開始沒有任何的開發經驗的話&#xff0c; 千萬不要著急&#xff0c;不要想著在短時間內就把一個語言學習好&#xff0c; 因為你之前沒有任何的學習經驗&#xff0c; 在這個過程中需要有耐心地學習完JAVA的基礎知識&#xff0c; 然后才開始踏上…

squirrel-foundation-demo

一個簡單的squirrel-foundation-demo 利用狀態機模擬一個訂單的支付過程。 squirrel-foundation沒有任何嚴重的依賴關系&#xff0c;因此基本上它應該是高度可嵌入的。squirrel-foundation沒有整合spring框架&#xff0c;所以首先要用spring集成squirrel-foundation。spring集成…

MongoDB學習目錄

MongoDB基礎篇 MongoDB 之 $ 關鍵字 python操作MongoDB 轉載于:https://www.cnblogs.com/yanzhi-1996/p/11095016.html

講的真透徹!還有人不知道什么是AndroidX的嗎?已拿offer入職

前言 春招已經接近尾聲了&#xff0c;不知道各位小伙伴有沒有收獲自己心儀的offer呢。筆者疫情被裁后在家LeetCode狂刷了800多題&#xff0c;加之自己以為工作總結的知識、經驗&#xff0c;系統化的整理了一下。在五一期間已經收獲了字節的offer。廢話不多說&#xff0c;下面是…

docker 啟動的 jenkins 中調用宿主機docker進行build

前言 期初有這個需求感覺就跟套娃一樣&#xff0c;你在docker 中調用docker&#xff0c;笑哭……這個也太逗了。 不過的確遇到了&#xff0c;因為jenkins 容器中沒有docker &#xff0c;所以在編譯 docker build 的時候 會出現 docker command 不存在。 好吧&#xff0c;解決他…

Codeforces 773D Perishable Roads 最短路 (看題解)

Perishable Roads 智商題&#xff0c; 不會啊。。 貼個官方題解 https://codeforces.com/blog/entry/51883 #include<bits/stdc.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_p…