主頁 > 後端開發 > 第一次OOP作業-Blog總結

第一次OOP作業-Blog總結

2021-04-05 06:07:47 後端開發

前言

  • 第一次作業一共八道題,此次作業也是這三次作業中最接近面向程序程式設計的題目集,整體難度偏低,總耗時1.5h,主要的知識點在熟悉Java的語法上,整體題目的邏輯非常清晰簡單,但最后一個判斷三角形型別中有一些小坑(踩進去以后才發現原來是輕敵了),
    image
  • 第二次題目集的考察內容主要為類和物件的設計,此次題目集開始培養我們的面向物件思維,整體題目難度偏中等,一共五道題,耗時3h,主要卡在求前n天的演算法設計,其中忽略了一些特殊情況,
    image
  • 第三次題目集可以說是這三次中最難的一次了,一共三道題,前兩道是那種題目要求清晰,設計思路明顯的題,所以很快就做完了,最最最上頭的還是最后一道題,一元多項式的求導,前前后后一共花了四個晚上,但是有一個5分的測驗點(合法性)一直過不去,后來也在嘗試寫能夠覆寫所有型別的正則,但是這一點還是優化失敗了,后面會著重說明解題與優化其他點的思路:).
    image

設計與分析


題目集01 7-8 判斷三角形型別
  • 第一次作業判斷三角形型別,按照大學之前積累的關于圖形的知識,其實就可以根據邊的關系判斷此三角形的型別(但是,這是我們的判斷),對于機器內部,可不是這樣的,其中一個直角三角形的判定測驗點一直過不去,按照正常思維,只要任意兩條邊的平方和等于第三邊,我們就默認它為直角三角形.But對于無理數而言,這個等式有時是不成立的,所以在這種情況下,只有對相應的值取精度判定,例如:(a*a+b*b-c*c<1e^-2),這里的1e^-2就是精度,加上這個條件后,直角三角形才能被判定(太能卡了,這里一直迷惑:)).
  • 此外,這里判定三角形的條件if的先后順序也非常重要,有一些相類似的判定條件,如果順序放錯了,結果可能也會出錯,例如:判斷等腰三角形的條件放在了判斷等腰直角三角形的前面,判斷直角三角形的條件放在了判斷等腰直角三角形的前面,最后的結果雖然在數學層面來說可能是對的,但是對于此題目的要求卻有可能達不到.對于第一種情況,三條邊的長度可以分別為根號2,根號2,2,判斷的結果為等腰三角形,但是對于題目來說他就是等腰直角三角形,第二個就不做贅述了,還有其他的組合可能,都會出現類似的需求錯誤,
  • SourceMonitor分析結果

Percent Branch Statements 0.0
Method Call Statements 18
Percent Lines with Comments 5.1
Classes and Interfaces 1
Methods per Class 4.00
Average Statements per Method 3.75
Line Number of Most Complex Method 6
Name of Most Complex Method Main.main()
Maximum Complexity 1
Line Number of Deepest Block 22
Maximum Block Depth 5
Average Block Depth 2.70
Average Complexity 1.00


Most Complex Methods in 1 Class(es)

Complexity, Statements, Max Depth, Calls

1, 6, 2, 4


UML類圖
image

判斷的條件均寫在了方法里,這次沒有做類的設計,將方法寫在了主類中,判斷用了多重if嵌套,其實邏輯很清晰,就只要注意直角三角形判斷的精度和判斷的順序,這道題就可以完美解決啦,


題目集02 7-1 IP地址轉換
  • 這道題其實就已經可以用到正則運算式的知識了,題目的輸入要求很簡單,但是如果用String自帶的charAt或類似的方法判斷輸入是否合法,可能就比較冗余了,Regex="[0|1]{32}".
  • 接下來就是對字串的操作了,這里有一個比較大的坑,就是在接收輸入的時候得是接收nextLine()的輸入,不然如果輸入空字符,這時候接收的還是next(),這時候程式不會輸出WrongFormat,而會一直等待輸入,而如果接收的是nextLine(),這時候輸入回車,程式將會直接輸出WrongFormat,
  • 這里想稍微討論一下解決字串轉換的問題(這里一定有更高效的演算法來處理,給大伙分享一下我的拙見),我用的是Integer內帶的parseInt方法和String類內部的SubString處理的規范字串
    image
  • 這里用的還是面向程序的思維,但是這其實是進制轉換的一個程序,查到的資料內部還有位運算子的概念=w=,

題目集02 7-4求下一天
  • 題目要求不允許使用Java中的日期相關的類和方法,并且給我們提供了幾個必須實作的方法,
    image
  • 先說一下這個合法性吧,在題目提供的合法性范圍內,年份月份和日期都很明確了,所以在寫checkInputValidity方法的時候按理來說就是照著抄的,但是筆者在寫的時候忽略了一個問題,每個月他的日期并不是在1到31之間就是合法的,其中一三五七八十臘月都是31天,四六七九十一月都是30天,二月根據是否為閏年,判斷為28天還是29天,對于每月多少天的設計,我的想法是封裝在一個方法內部設計在一個dayPerMonth方法來簡化判斷操作,方法內部使用Switch判斷(剛開始用if else陳述句判斷,好家伙,圈復雜度直接起飛),這里還可以使用陣列來存每個月對應的天數,在對應的閏年將二月份的天數改一下就好了.
    image
  • 接下來就是求規定日期的下一天的演算法設計了,這里筆者是先考慮各種特殊情況,例如12月的最后一天,每個月的最后一天,最后才是考慮一般的情況,這里邏輯比較簡單,就不做贅述了,
    image
  • SourceMonitor分析結果
    Percent Branch Statements 49.0
    Method Call Statements 10
    Percent Lines with Comments 9.1
    Classes and Interfaces 1
    Methods per Class 4.00
    Average Statements per Method 9.50
    Line Number of Most Complex Method 40
    Name of Most Complex Method isLeapYear().if(()
    Maximum Complexity 2
    Line Number of Deepest Block 19
    Maximum Block Depth 3
    Average Block Depth 1.37
    Average Complexity 1.50

Most Complex Methods in 2 Class(es):
Complexity, Statements, Max Depth, Calls

isLeapYear().if(() 2, 3, 2, 0
Main.main() 1, 6, 2, 4

UML類圖
image


題目集02 7-5 求前N天
  • 這里的其他方法相較題目四都無區別,唯一有區別的就是,上道題的求下一天變成了求前N天,這時考慮的范圍就要稍微擴大一點了,需要判斷N天前是否跨年,是否跨月了,但是思維沒有發生太大的改觀,都是先處理特殊情況,再處理一般情況,這里唯一踩過的坑就是在判斷差值的時候,把judge=0的情況判斷在else中,導致需求輸出0天前,系統輸出的是Wrong Format.
    image
  • 其實這里用類的設計思維可以使得程式變得更加簡潔明了,如果按照這個設計風格的話,就還是停留在面向程序程式設計的層次了,這個在后面的題目集中進行了修改,

  • SourceMonitor分析結果

Percent Branch Statements 45.6
Method Call Statements 15
Percent Lines with Comments 16.7
Classes and Interfaces 1
Methods per Class 6.00
Average Statements per Method 8.33
Line Number of Most Complex Method 16
Name of Most Complex Method Main.DaysAgo()
Maximum Complexity 7
Line Number of Deepest Block 71
Maximum Block Depth 4
Average Block Depth 1.82
Average Complexity 3.33


Most Complex Methods in 2 Class(es):
Complexity, Statements, Max Depth, Calls

isValid().if(() 2, 3, 2, 0
Main.DaysAgo() 7, 10, 3, 9
Main.main() 1, 7, 2, 5

UML類圖

image


題目集03 7-2 定義日期類 求下一天
  • 這幾次的日期題采用了迭代升級難度的方式,一步步把我們面向程序設計的思想帶到面向物件設計來.題目給出了類圖,不得不說看著類圖寫程式,思路是真的清晰,不管是寫部分功能也好,寫工程專案設計也罷,一種良好的設計模式總是能讓設計事半功倍,所以在處理問題前至少需要花70%的時間來設計類圖.

image

  • Date類中要求設計的每月多少天的陣列,簡化了DayPerMonth中的操作與判斷,在使用時,只需要判斷該年是否為閏年,將陣列中第三個元素改為29or28就行了.
    private int[] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};

image


  • SourceMonitor分析結果

Percent Branch Statements 17.9
Method Call Statements 9
Percent Lines with Comments 4.6
Classes and Interfaces 2
Methods per Class 6.50
Average Statements per Method 3.00
Line Number of Most Complex Method 64
Name of Most Complex Method isLeapYear().if(()
Maximum Complexity 2
Line Number of Deepest Block 31
Maximum Block Depth 3
Average Block Depth 1.07
Average Complexity 1.50


Most Complex Methods in 2 Class(es):
Complexity, Statements, Max Depth, Calls

isLeapYear().if(() 2, 3, 2, 0
Main.main() 1, 7, 2, 4

UML類圖

image

  • 在大多數情況下,需要盡可能完美的解決一個問題,一個類其實是不太妥當的,這很可能就違背了類的單一職責原則(這個原則在規范思想的時候真的超管用!!)
    image

  • 在我的理解中,對此題進一步的優化就是,將Date中處理日期,輸出日期的方法,放到另外一個類中,這個類里有Date的實體化物件(這個在下一題處理多項式的項中會有比較好的體現),專門用來處理用戶自定義類Date里邊的資料,提高了程式的可擴展性.

題目集03 7-3 一元多項式求導(類設計)
  • 說實話一開始讀完這個OO作業3-3作業指導書,我是毫無頭緒的,但是對于這個業務背景我們又是非常熟悉的,什么是帶符號整數,冪函式,項,相應的運算式以及對應的求導演算法,我們可以說是知根知底了,但是真的需要將其抽象起來,思維就好像是一片空白.

image

正則運算式書寫
  • 但是冷靜下來,仔細梳理一下,發現也許大體思路很清晰,用戶輸入對應的字串后,可能其中含有空格,如果有空格的話,后面寫正則需要考慮的情況就多了很多了,所以綜合考量后,決定在主程式中就把空格干掉!replaceAll("[ ]", ""),這里說下我犯的小錯把,這里一開始正則運算式沒有帶旁邊的中括號,前面系數字串里就是一個空格,最后的結果就是,系統不認這個正則,處理后的字串和處理前的沒區別=w=,好了,接下來就是對正則運算式進行一個合法性判斷,剛開始,我一直糾結什么樣的運算式才算是合法的,這次的需求分析內只是說有帶符號常數,冪函式,那么肯定要把相應的項種類設定成對應的類,這樣也方便后面的求導演算法擴展,那么常數和冪函式的正則運算式都挺好寫的
    (這里的寫法很多,我分享一下我的思路吧)

  • 常數正則:"(([+-])?(([1-9][0-9]*)|[0-9]))"

  • 冪函式正則:"((([+-])?([1-9][0-9]*\\*)?))x((([\\^][+-]?[1-9][0-9]*)|()))"

  • 后來想了一下,既然這道題對項的定義內這兩個都有,那么一個合法的項應該是常數或者冪函式,借助這個思路,也就順水推舟寫出了多項式的正則了,籠統點理解就是一項or大于一項的正確的項

  • 項正則:"(((([+-])?([1-9][0-9]*\\*)?))x((([\\^][+-]?[1-9][0-9]*)|())))|(([+-])?(([1-9][0-9]*)|[0-9]))"

  • 多項式正則:"((((([+-])?([1-9][0-9]*\\*)?))x((([\\^][+-]?[1-9][0-9]*)|())))|(([+-])?(([1-9][0-9]*)|[0-9])))*"

這兩個正則唯一的區別就是:(多了個星號*)

  • 如果沒有正則運算式的話,這道題的作業量將難以想象的大了AwA,他就像是總結了這個元素的規則,在撰寫前一定一定要盡可能地將所有的條件都考慮到,這樣無論是在判斷,還是在之后的組合優化,都會非常方便,

  • 那么這里的難點就在于,多項式個相對復雜的正則應該怎么寫,個人觀點:就像題目集的迭代一樣,在一開始把問題需要解決的各個part細心分析出來,再一步步細化,就有點自頂向下的味道了,多項式->項->(常數,冪函式),一步步的將其簡單化,最后根據相應的需求進行組合就ok啦,

多項式求導

對于這部分的大體思路是:先對項求導,再將項求導后的結果存盤起來,拼接成一個完整的字串.

但是這里其實有四個問題需要解決

  • 項求導演算法的設計
  • 求導前后的元素存盤結構設計
  • 如何根據輸入的項創建不同種類的物件
  • 如何將求導后的物件按照任務書的需求拼接
項求導演算法的設計

在說設計之前,需要說明的一點就是,因為這里的各個項的系數測驗點內部,有超過Int型別的值測驗用例存在,所以這里的屬性宣告采用BigInteger型別.不然用int型是裝不下二三十位數的:)

- 設定的抽象父類

image

- 常數項
常數項的求導真的非常簡單,這里在不考慮常數前符號的情況下,對于任意常數,求導結果都為0
image
不過在設計常數轉換為字串的抽象方法實作時,需要考慮到常數的符號,再轉換成相應的字串
image

- 冪函式

對冪函式的求導,按照求導演算法,這里先對系數和指數進行求導操作
image
比常數要復雜一些,這里需要對系數和指數的各個情況進行綜合考慮,求導之后若系數為0,則說明系數在處理之前就已經為0了,也就是說這其實是一個不合法的冪函式運算式,在處理這類運算式時,把他看成常數項處理(這里不管怎么求導都是0).求導之后若系數不為0,則該運算式為冪函式,我們就創建一個對應冪函式的物件,該方法回傳的是一個Factor物件(提一下,這里的Factor是PowerFunction和ConstantNum的抽象父類),在處理多項式求導的類中運用了這幾個類的多型來解決設計問題.
image

求導前后的元素存盤結構設計

在設計之初,是想用陣列存盤的,但是轉念一想,我需要存盤的是一項項物件,而不是簡單的存盤字串,如果按照存盤字串的思維來想的話,又跳轉到面向程序的設計結構了,所以這里把陣列的念頭給打消了,運用了ArrayList<class>來存盤指定型別的物件,ArrayList是一種動態陣列,在添加資料時,就不需要考慮會不會溢位了,同時這里很多封裝的方法(增add刪remove改set查indexof插)使用的也很方便,先按照判斷項的正則將多項式分解為項,均存入Term中,再進行一項項求導,結果存入AfterDev中,細節在下方創建不同種類物件說明.

image

包括接下來對ArrayList中的物件元素存盤也是使用ArrayList存盤,這兒的處理思想就是按照字串來處理了,比較好理解,

image

正則運算式書寫
  • 但是冷靜下來,仔細梳理一下,發現也許大體思路很清晰,用戶輸入對應的字串后,可能其中含有空格,如果有空格的話,后面寫正則需要考慮的情況就多了很多了,所以綜合考量后,決定在主程式中就把空格干掉!replaceAll("[ ]", ""),這里說下我犯的小錯把,這里一開始正則運算式沒有帶旁邊的中括號,前面系數字串里就是一個空格,最后的結果就是,系統不認這個正則,處理后的字串和處理前的沒區別=w=,好了,接下來就是對正則運算式進行一個合法性判斷,剛開始,我一直糾結什么樣的運算式才算是合法的,這次的需求分析內只是說有帶符號常數,冪函式,那么肯定要把相應的項種類設定成對應的類,這樣也方便后面的求導演算法擴展,那么常數和冪函式的正則運算式都挺好寫的
    (這里的寫法很多,我分享一下我的思路吧)

  • 常數正則:"(([+-])?(([1-9][0-9]*)|[0-9]))"

  • 冪函式正則:"((([+-])?([1-9][0-9]*\\*)?))x((([\\^][+-]?[1-9][0-9]*)|()))"

  • 后來想了一下,既然這道題對項的定義內這兩個都有,那么一個合法的項應該是常數或者冪函式,借助這個思路,也就順水推舟寫出了多項式的正則了,籠統點理解就是一項or大于一項的正確的項的組合

  • 項正則:"(((([+-])?([1-9][0-9]*\\*)?))x((([\\^][+-]?[1-9][0-9]*)|())))|(([+-])?(([1-9][0-9]*)|[0-9]))"

  • 多項式正則:"((((([+-])?([1-9][0-9]*\\*)?))x((([\\^][+-]?[1-9][0-9]*)|())))|(([+-])?(([1-9][0-9]*)|[0-9])))*"

這兩個正則唯一的區別就是:(多了個星號*)

  • 如果沒有正則運算式的話,這道題的作業量將難以想象的大了AwA,他就像是總結了這個元素的規則,在撰寫前一定一定要盡可能地將所有的條件都考慮到,這樣無論是在判斷,還是在之后的組合優化,都會非常方便,

  • 那么這里的難點就在于,多項式個相對復雜的正則應該怎么寫,個人觀點:就像題目集的迭代一樣,在一開始把問題需要解決的各個part細心分析出來,再一步步細化,就有點自頂向下的味道了,多項式->項->(常數,冪函式),一步步的將其簡單化,最后根據相應的需求進行組合就ok啦,


項求導演算法的設計

在說設計之前,需要說明的一點就是,因為這里的各個項的系數測驗點內部,有超過Int型別的值測驗用例存在,所以這里的屬性宣告采用BigInteger型別.不然用int型是裝不下二三十位數的:)

- 設定的抽象父類

image

- 常數項
常數項的求導真的非常簡單,這里在不考慮常數前符號的情況下,對于任意常數,求導結果都為0
image
不過在設計常數轉換為字串的抽象方法實作時,需要考慮到常數的符號,再轉換成相應的字串
image

- 冪函式

對冪函式的求導,按照求導演算法,這里先對系數和指數進行求導操作
image
比常數要復雜一些,這里需要對系數和指數的各個情況進行綜合考慮,求導之后若系數為0,則說明系數在處理之前就已經為0了,也就是說這其實是一個不合法的冪函式運算式,在處理這類運算式時,把他看成常數項處理(這里不管怎么求導都是0).求導之后若系數不為0,則該運算式為冪函式,我們就創建一個對應冪函式的物件,該方法回傳的是一個Factor物件(提一下,這里的Factor是PowerFunction和ConstantNum的抽象父類),在處理多項式求導的類中運用了這幾個類的多型來解決設計問題.
image


求導前后的元素存盤結構設計

在設計之初,是想用陣列存盤的,但是轉念一想,我需要存盤的是一項項物件,而不是簡單的存盤字串,如果按照存盤字串的思維來想的話,又跳轉到面向程序的設計結構了,所以這里把陣列的念頭給打消了,運用了ArrayList<class>來存盤指定型別的物件,ArrayList是一種動態陣列,在添加資料時,就不需要考慮會不會溢位了,同時這里很多封裝的方法(增add刪remove改set查indexof插)使用的也很方便,先按照判斷項的正則將多項式分解為項,均存入Term中,再進行一項項求導,結果存入AfterDev中,細節在下方創建不同種類物件說明.

image

包括接下來對ArrayList中的物件元素存盤也是使用ArrayList存盤,這兒的處理思想就是按照字串來處理了,比較好理解,

image


如何根據輸入的項創建不同種類的物件

UML類圖

image

  • 除了主類以外,這里一共有五個類,一個抽象類,四個物體類,其中ConstantNum(常數)與PowerFunction(冪函式)類繼承抽象類Factor,polynomial類是多項式類,內部寫了大致的處理框架與規范輸出框架,具體的處理細節在DealInputItems中的DealItems方法,回傳的是Factor型別的值,因為在處理項之前并不知道是常數項還是冪函式項,所以將回傳值設定為兩個類的父類,這樣在polynomial類中實作多項式求導演算法就可以借助DealInputItem的物體類完成處理了,

image

現在我分享一下我處理這個問題的思路吧,這里用排列組合的方式大致分出了冪函式的所有型別,根據有無正負號,有無指數,系數是否為1(這里的前提是不為0),分為8種情況,這里我用陣列將各種情況的正則運算式存盤起來,用于判斷該項若是冪函式,應該歸類到哪類的冪函式(這里的實作方法可能相對效率低,后面迭代會去學著用Map類中的鍵值對思想來實作,因為之前查閱資料綜合分析之后,發現Map和Tree的思想更適合該類題目的設計)

image

該函式的主邏輯思維大致如下:

  • 根據冪函式正則與常數正則判斷該項的型別.
  • 若匹配常數,則直接回傳ConstantNum類的物件.將系數直接賦值,
    image
    若匹配的是冪函式,則對該項進行依次的正則匹配,此時的系數與指數的賦值與分配就有所差異了,

對于沒有系數和指數的冪函式,對系數和指數的賦值創建物件就很簡單了,可以直接賦值,就像這樣
image
那么大部分情況其實還是需要我們去分割字串的,在有系數或者有指數的情況下,我們需要將指系數分離,借助String類中的split方法,取得相應的值,再賦給對應引數,break后回傳相應Factor物件,
image
完成上面這一步后,邏輯就回傳到polynomial類中的求導演算法,由于回傳的是Factor類物件,所以在判斷求導之前,需要判斷回傳的物件是哪一個類的實體化,再創建實體化的物件,呼叫求導方法
image

最后回傳的值通過AfterDev存盤
image


如何將求導后的物件按照任務書的需求拼接

本來以為通過上面的步驟之后,就已經可以達到預期了,直到我碰到了這個測驗用例

image

如果第一眼看上去,憑感覺這個結果肯定是錯誤的,但是仔細一分析,求導演算法是對的,但是這個結果顯示在螢屏上就是我們不愿意看到的結果

image

后來我想弄明白到底是哪里出錯的時候,我決定在項和項之間加上空格判斷.

image

仔細查看每一項的求導結果,都是對的,大數測驗也是對的,唯一的錯誤點在于,當后面一項為正數時,前一項與后一項之間沒有“+”號,導致所有的項輸出都擠在一起了,那么怎么判斷這些項的正負呢(這其實也就是寫的大方面正則的一個特例),通過這個判斷,決定相應的項前需不需要加上“+”號,

image

接上正號后,輸出的結果是這樣的

image

好家伙,原本以為到這里就結束了,但是本著好奇的心,我對輸入輸出規則的每一項進行了校驗,結果證明我還是忽略了一些要素.

image

可以看到當求導結果為0時,結果并沒有按照任務指導書上說的那樣"不顯示",反而非常倔強彈出來個0,那么我想到的是,在輸出之前,對每一項做一個equals檢測,如果為"0"(字串),就把他remove.

image

處理后的結果是這樣的

image

但是當整個運算式的求導結果為"0"時

image

我的判定直接把所有的項都移除了(不得不說這就好像是面向需求編程=w=)

于是就有了下面這項操作

image

  • 雖然整體結果是幾乎成功把所有的條件都考慮清楚并解決的,但是實際上這樣寫,復雜度會升的很快,同時代碼也比較冗余,需要一遍遍的去應對出現的各種狀況,優化的改進就需要在類的設計上對各個情況先進行處理(在生成實體化物件之前,就對該項的每一種情況進行分析回傳),或者,換一種思路,使用Map,是一種映射表的概念,指數作為鍵,系數作為值,對每一項的求導值做一個映射(在題目集結束后參考各路大佬后得到了比較新穎的idea),不過自始自終這些分享只能作為參考,真正的融會貫通還需要自己思考,在已有的情況上進行不斷的優化改進,

SourceMonitor分析結果

Percent Branch Statements 21.3
Method Call Statements 59
Percent Lines with Comments 12.3
Classes and Interfaces 5
Methods per Class 5.00
Average Statements per Method 6.44
Line Number of Most Complex Method 231
Name of Most Complex Method DealInputItems.DealItems()
Maximum Complexity 12
Line Number of Deepest Block 257
Maximum Block Depth 6
Average Block Depth 1.96
Average Complexity 2.23


Most Complex Methods in 4 Class(es):

FunctionName Complexity Statements Max Depth Calls
ConstantNum.ConstantNum() 1 1 2 0
ConstantNum.ConstantNum() 1 0 0 0
ConstantNum.Derivation() 1 1 2 0
ConstantNum.getNumber() 1 1 2 0
ConstantNum.ParseToString() 4 6 3 4
ConstantNum.setNumber() 1 1 2 0
DealInputItems.DealItems() 12 48 6 10
Main.main() 3 7 3 4
polynomial.getPoly() 1 1 2 0
polynomial.isPolynomial() 1 3 2 3
polynomial.polynomial() 1 1 2 0
polynomial.polynomial() 1 0 0 0
polynomial.setPoly() 1 1 2 0

總結

  • 這其實也不是第一次接觸正則運算式了,之前在做C語言課設的時候就已經做到了所有的輸入資訊校驗,真的非常方便,不僅能規范輸入,還能降低因為誤輸入而導致的程式崩潰,方便處理傳入的資訊,那么在接下來的OOP題目集中,正則的使用范圍將會越來越廣,優勢也愈加明顯,
  • 另外,在程式設計基礎語言的函式模塊化設計的基礎思維上,面向物件編程不斷的強化模塊化與面向物件化的思想,從一Main到底,代碼紊亂->Main最簡潔,函式內部瘋狂套娃呼叫->各個模塊各司其職,粘連性低,易維護擴展,
  • 大部分題目其實如果真的只想達到需求的話,完全可以按照面向物件語言的思想一個個列出來,但是Java這門語言為我們提供各種強大的工具與語法,讓我們能夠以更加清晰的目光去看待問題中抽象的事物,抽象事物具體化,
  • 在看到測驗點一個個的由綠變紅,心中充滿喜悅的同時,其實也是對一次次優化的肯定,兩個小時連續提交十來二十次也不是什么怪事,找到問題,分析問題,解決問題,總結復盤與提升才是真正的挑戰!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272427.html

標籤:Java

上一篇:【分布式】SpringCloud(6)--Hystrix服務熔斷與降級

下一篇:OO第一次博客作業

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more