面向對象課程第一單元總結

来源:https://www.cnblogs.com/xsndzxc/archive/2019/03/23/10586026.html
-Advertisement-
Play Games

說來慚愧,在很久之前修這門課程的時候總是不能理解面向對象辯證思想的精髓所在,又沒有用軟體開發的標準嚴格要求自己,所以導致寫了一些類C程式後草草收場。時隔多年,課程的風格變化與老師和平臺提供的幫助,加上今年對於Java語言上更熟練的使用,讓我在第一個單元的學習中得到了很多,雖然並不能像大神一樣總結出技 ...


  說來慚愧,在很久之前修這門課程的時候總是不能理解面向對象辯證思想的精髓所在,又沒有用軟體開發的標準嚴格要求自己,所以導致寫了一些類C程式後草草收場。時隔多年,課程的風格變化與老師和平臺提供的幫助,加上今年對於Java語言上更熟練的使用,讓我在第一個單元的學習中得到了很多,雖然並不能像大神一樣總結出技術上的種種共性要點,但仍然可以在說自己作業的具體問題之前,總結出幾點基礎的東西,也算是給和當時的我一樣基礎不好的同學一點幫助。

Part 1. 再次學習這門課總結的小TIPS

1. 面向對象設計形象化的理解

  在各大搜索引擎如果你去搜索面向對象程式的特征和區別是什麼,你只會得到三個關鍵詞:封裝、繼承、多態。說的一點錯沒有,但是其實對初學者思想的轉變用處不大,無法讓你通過理解這三個詞就能一下子寫出典型的面向對象程式。如果你之前寫了一兩次類C程式,在思想的扭轉上苦苦不能完成轉變,我相信造飛機的例子就是一個非常典型的講解,會有所幫助。汽車是流水線的產物,強調整體性,裝配的連貫性;飛機則是組件外包,組件各自生產,統一完成組裝的產品,畢竟這個世界上沒有對應飛機那麼大的流水線。

  我們在編寫C語言程式的時候,養成的是一種問題分解的思維步驟:這是一道怎樣的數學問題,輸入是啥,輸出是啥;弄明白要求後我們會按照輸入處理→數據計算儲存→數據輸出的線性方式對問題的解決進行構想。但寫面向對象的程式更像是畫設計圖,雖然我們仍然無法避免輸入,輸出,但你首要思考的是我們要用幾種類來處理這些問題,各種類之間如何設計方法,如何創建實例並調用。就好比我們處理了三次的字元串求導,對象有表達式,項,因數這三種,調用是層層遞進的關係,而我們只需要對處理不同的對象創建相應的方法,將類內部變數隱藏好,將該傳遞的參數設計好,問題就已經完成了分析,迎刃而解了。

  萬事開頭難,你的思想如果從畫流程圖改成畫平面設計圖,那麼對於面向對象設計的初步轉變其實就完成了。

2. 標準與規範

  之所以把這一點放在第二點,是因為課程引入的代碼風格檢測同樣是評價作業完成情況的標準,而且與我們其實是我們寫代碼時按順序來講關註的頭幾個問題之一,之前老師上課時調侃:“一些同學的風格分是一次一次從0變成100的”,這算是一個非常嚴肅的問題。我們的作業代碼其實是不要求註釋行數的,所以並不需要“照顧”互評同學的可讀性(這隻是一個不負責任的說法),你甚至可以不照顧自己的可讀性,但這並不意味著風格不重要。

  課程提供的加上Idea上整合的一些checkstyle工具可以從最基礎的層面實時幫助我們改掉寫代碼的一些壞毛病、壞佈局等等,在寫的初期就堅持這麼做可以有效地為以後做工作避免麻煩(親身經歷)。課上舉例那個 int i = 0; int ii = 0;int iii = 0;,就是我一個學競賽的舍友出門工作第一個月寫的代碼風格,被BOSS瘋狂要求返工……按理來說演算法上我這位舍友應該遠超校招其他新人,但是代碼也是講究臉面的,不會有任何一個開發組領導會允許這種情況出現。

  回到我們的課程初衷,除了面向對象的設計思想培養訓練,其實軟體開發素養的培養也是最初的目的之一,寫的時候按標準要求自己,不光意味著更高的風格分,還意味著你能更好的讀懂你寫的東西。行長度,布爾表達式複雜程度,方法長度,文件長度等等都會時時提醒你代碼設計上的不足,好的代碼不會超長,更不會在命名上出些亂七八糟的東西,所以如果能夠在寫的時候規避這些問題,可以從另一角度督促我們註意設計的細枝末節。

3.設計的重要性

  這個應該已經適應這門課程的同學都有所體會,設計的時間本身並不是無效的、占用寫代碼時間的。在我看來,我們做一次作業用的總時間等於設計思考時間加上碼代碼時間,反而是一個定值。設計的時間越長,想的越清楚,碼代碼的時間耗費的其實越短(當然不要舉一些極端的例子來反駁這句話);看指導書的時間越長,DEBUG的時間就越短。我這幾次強測都有一點小錯,其中有兩個就是因為沒看到繫數的範圍,導致自己先入為主定義了一個LONG型,被同一測試組的同學瘋狂hack -_-||(畢竟是擺在明面上的錯)。

  如果你在一周的作業上周二晚之前用的總時長是24小時,那我覺得,這裡面可以用2小時去通讀指導書,6小時設計,包括自己要用到的類,類中的方法,輸入處理,輸出處理,數據儲存處理等等,看的越全面越好,想的越細節越好,這樣編碼的過程中會省出很多南轅北轍的思考成本,DEBUG的時候也會遇上更少的BUG。

 

Part 2. 從自己作業中總結的一些問題

 1. 輸入處理

  這其實就是我說的思考的重要性的體現,我看一些同學其實已經用文法的格式總結了這次作業的輸入格式,應該說是比較清楚,但是在互評中也確實有沒想清楚的同學存在。正確的我就不寫在下麵了,第三次作業討論區有一些同學分享的清楚的定義。這裡說一下我聽到的某種問題。

  比如:嵌套因數sin cos括弧內是因數而不是表達式,所以如果括弧內是一個表達式,那一定要是表達式因數,所以可以出現 sin((x+1)),不能出現sin(x+1)。這個是我聽說過的一個比較典型的理解錯誤,指導書沒讀懂,不過出這個錯的基本都自己DEBUG改過來了,否則中測都過不去(大概)。

 2. 輸出處理

  這個是我自己在第二次作業中出現的問題,還因此扣了代碼格式分,頂層沒設計好搞了好多布爾表達式,然後寫了個200行方法……

  比如: 多因數輸出時處理開頭繫數為1,-1的情況就是用很多的布爾表達式去判斷如何化簡,而且還出錯了……,出現了形如“*sin(x)”的錯誤(繫數為1,化簡撲街),我後來想了想,在存數據的時候繫數不應該和後面的各項因數割裂開,然後輸出的時候挨個去判斷,才有了這種容易出錯的問題。

 3. 存繫數用的long

  感覺估計一個班並沒多少犯這個錯的,略。

 4. 正則表達式的構建

  這個嚴格來講不算個BUG,只是像之前研討課所說的,避免大正則出現(我前兩次寫的也是大正則),大正則一時爽,互評直奔火葬場。而且大正則寫對了還好說,寫錯了可就坑了DEBUG的自己了,所以,除了第三次作業,前兩次最好分層寫,這也是我從互評中學到的一些簡潔的典範,第三次涉及到遞歸,也沒法寫大正則,算是強制治了一下疑難雜症……

5. 對項的切割問題

  集中體現在第三次作業,嵌套因數內的表達式有可能也會切出合乎正則的項,但由於我遞歸正則的處理問題,為了防止出現切除的項不在一層表達式中,我加了一個左右括弧的判定條件,這個判定條件直接導致了帶符號整數的檢測出現問題,互測被機槍掃射打成篩子……處理也比較簡單,直接識別正負號前面的符號是啥,如果是^*這種則不進行切割,如果不是就作為項分離的標誌。這種問題來源於自己測自己程式時不細緻,其實可以避免的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目前主流瀏覽器的相容性做的都比較好了,本文主要針對IE6,7的不相容問題進行解決。 1.圓盤時鐘有浮動存在時,計算一定要精確,不要讓內容的寬高超出我們所設置的寬高,IE6下,內容會撐開設置好的高度。 解決方法:給對應的父級加overflow:hidden;但是會有部分被隱藏掉,最好是精確計算寬高再設 ...
  • 點擊複製到剪切板,相容性很好,可以自定義樣式,加以美化。 ...
  • 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>Bootstrap3級聯多選下拉框</title> 5 <meta charset="utf-8"> 6 <link rel="stylesheet" href="F:/webClient/bootstrap- ...
  • jQuery動畫 1.hide([speed,[easing],[fn]]) 方法:隱藏顯示的元素 參數: ①speed[,fn] speed:三種預定速度之一的字元串("slow","normal", or "fast")或表示動畫時長的毫秒數值(如:1000) fn:在動畫完成時執行的函數,每個 ...
  • transition屬性目的是讓css的一些屬性(如background)的以平滑過渡的效果出現。它是一個合併屬性,是由以下四個屬性組合而成: transition-property:設置應用過渡的CSS屬性,如background。 transition-duration:設置過渡效果花費的時間。 ...
  • CSS3圓角#css3-circle{ width: 150px; height: 150px; border-radius: 50%; }CSS3 橢圓形css3 radius#css3-elipse{ width: 200px; height: 100px; border-radius: 50% ...
  • 一、程式設計思路 在我的三次作業中都採用了類的分層結構,採用逐項匹配,分層求導的思路。 (一)、 第一次作業中構建了Polynimial(多項式)類,在類的構造器中就完成了對非法空格的判斷並對合法表達式進行刪除空格處理。由於第一次作業僅含有帶有繫數的冪函數與常數項,因而我就沒有專門構建針對每一個項的 ...
  • 一,解決類與類之間代碼允餘問題有兩種方案: 1,繼承 2,組合 1,繼承:描述的是類與類之間,什麼是什麼的關係 2,組合:描述的是類與類之間的關係,是一種什麼有什麼關係 一個類產生的對象,該對象擁有一個屬性,這個屬性的值是來自另一個類的對象 二,組合練習: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...