国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使用Java開(kāi)發(fā)計(jì)算器(一)

2019-11-18 14:56:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

     以前一直做J2EE的程序,對(duì)J2SE的程序不很了解非凡是UI設(shè)計(jì)。因此雖然如此小的一個(gè)程序,對(duì)我來(lái)說(shuō)都是一個(gè)很大的挑戰(zhàn)。可能網(wǎng)上的計(jì)算器很多,java版本的也不少,但是似乎實(shí)現(xiàn)的功能都是比較簡(jiǎn)單(應(yīng)該是我沒(méi)有發(fā)現(xiàn)),于是就想自己寫(xiě)一個(gè)。從上一個(gè)星期開(kāi)始設(shè)計(jì),花費(fèi)了將近兩個(gè)星期的時(shí)間,終于在昨天把它作完了。在這期間我碰到不少的問(wèn)題,同時(shí)也學(xué)到不少的知識(shí),在這里希望可以和大家共享。
    一、設(shè)計(jì)思想
    1、界面與邏輯相分離的原則。應(yīng)用程序都需要有操作界面和用戶互動(dòng),并且需要有后臺(tái)邏輯對(duì)用戶的輸入作相應(yīng)的處理。面向?qū)ο蟮木幊陶Z(yǔ)言最大的好處,就是提高了程序的可重用程度,降低維護(hù)成本。因此,假如我們把用戶界面和業(yè)務(wù)邏輯混在一起的話,也同樣可以實(shí)現(xiàn)的功能,但是到了最后,你會(huì)發(fā)現(xiàn)這個(gè)程序,就像一個(gè)搖搖欲墜的樓房一樣,根本就不能碰,跟別說(shuō)升級(jí)和維護(hù)。但是假如把界面和邏輯分開(kāi),界面或者邏輯的修改都不會(huì)干擾到對(duì)方,并且這個(gè)業(yè)務(wù)邏輯的程序同樣可以在另外一個(gè)具有相同邏輯的系統(tǒng)中使用,因此大大提高了程序的可重用性和維護(hù)性。
    2、單一職責(zé)原則。我們?cè)谠O(shè)計(jì)時(shí)總是在降提高內(nèi)聚性,降低耦合性,而這個(gè)原則恰恰就是降低耦合性的一個(gè)很好的原則。每一個(gè)類只承擔(dān)屬于本身的責(zé)任,也就是僅有一個(gè)可以引起它變化的原因。在這個(gè)計(jì)算器的開(kāi)發(fā)過(guò)程中,很好的遵循了這個(gè)原則。就用戶界面的設(shè)計(jì)而言,它包含了很多不同功能的按鈕,但是仔細(xì)研究就會(huì)發(fā)現(xiàn),有些按鈕的作用是相同的,例如對(duì)于數(shù)字鍵來(lái)說(shuō),它們的功能就是按下時(shí)在顯示器顯示相關(guān)的數(shù)字,雖然小數(shù)點(diǎn)和正負(fù)號(hào)不是數(shù)字鍵,但是它們和數(shù)字鍵的功能是一致的,因此就把它們放在了一個(gè)面板中(NumberPanel)。剩余的按鍵也是按照這個(gè)原則劃分為了幾個(gè)不同的面板,例如運(yùn)算符面板(OperatorPanel)、設(shè)置位寬的面板(BitWidthPanel)、各進(jìn)制之間的切換面板(SystemPanel)等等。
    3、開(kāi)放—封閉原則(OCP)。這是援引Robert C. Martin所著的《靈敏軟件開(kāi)發(fā)——原則、模式與實(shí)踐》一書(shū)中的話。它的意思是說(shuō),根據(jù)這個(gè)原則設(shè)計(jì)的模塊有兩個(gè)特征:對(duì)于擴(kuò)展是開(kāi)放的,也就是模塊可以隨時(shí)根據(jù)需求的變化進(jìn)行擴(kuò)展;對(duì)于修改是封閉的,對(duì)模塊進(jìn)行擴(kuò)展時(shí)不需要修改模塊的任何代碼,并且模塊內(nèi)部任何修改都不應(yīng)該影響到外部程序。因此在程序的設(shè)計(jì)中,一個(gè)類對(duì)于客戶程序員無(wú)論何時(shí)都提供一個(gè)相同的接口,外部傳入一個(gè)參數(shù),這個(gè)類就像相應(yīng)的傳回一個(gè)結(jié)果。計(jì)算器中的業(yè)務(wù)邏輯程序,例如數(shù)學(xué)計(jì)算類(MathCompute)和各進(jìn)制之間的轉(zhuǎn)換類(Convertion)都使用了這個(gè)原則。
    4、保證提供給外部的每一個(gè)方法都可以正常運(yùn)行。在以往的開(kāi)發(fā)中,總是一直得寫(xiě)呀寫(xiě)呀,并不管寫(xiě)出的類能不能正確運(yùn)行。于是到了最后的集成階段,才忽然發(fā)現(xiàn)程序根本就不能通過(guò)。這時(shí)的程序已經(jīng)是一個(gè)很龐大的怪物,要想跟蹤一個(gè)小小的錯(cuò)誤,要花費(fèi)不少的心機(jī)。因此在開(kāi)發(fā)過(guò)程一定注重單元測(cè)試,要保證提供給外部的每一個(gè)方法都可以正確的運(yùn)行。在這個(gè)過(guò)程,JUnit幫了很大的忙,在后面再具體介紹它的使用方法。
    以上的這些設(shè)計(jì)思想和原則給整個(gè)開(kāi)發(fā)過(guò)程帶了很大的幫助,并且使開(kāi)發(fā)變得有趣起來(lái)。
    二、具體開(kāi)發(fā)過(guò)程
    這個(gè)開(kāi)發(fā)的工程都是由設(shè)計(jì)、編碼和測(cè)試三部分組成。下面就各進(jìn)制之間的轉(zhuǎn)化類Convertion來(lái)說(shuō)明開(kāi)發(fā)過(guò)程。
    1、設(shè)計(jì)。
    首先應(yīng)該分析這個(gè)說(shuō)要完成的功能,它的主要任務(wù)是完成十六進(jìn)制、十進(jìn)制、八進(jìn)制和二進(jìn)制之間的相互轉(zhuǎn)化,需要包含負(fù)數(shù),但不用考慮小數(shù)。
    其次,確定接口參數(shù)。根據(jù)功能可知,它傳遞給外部的就是一個(gè)轉(zhuǎn)后的數(shù)據(jù),而外部除了需要傳遞給轉(zhuǎn)化前的數(shù)據(jù)以外,是否還需要其他參數(shù)呢?我們都知道,十進(jìn)制的負(fù)數(shù)同樣可以利用其他進(jìn)制進(jìn)行表示,例如二進(jìn)制,轉(zhuǎn)化方法是:求十進(jìn)制數(shù)的絕對(duì)值對(duì)應(yīng)的二進(jìn)制數(shù),最高位為1;然后對(duì)二進(jìn)制逐位求反,最高位除外;接著最低一位加1,需要進(jìn)位的話依次進(jìn)位,最高位除外。如今的問(wèn)題就擺在了我們面前,我們?nèi)绾沃肋@個(gè)數(shù)的最高位是第幾位呢,也許有人會(huì)說(shuō),那就用轉(zhuǎn)化后的前面再加上一位,好,即使這樣可以成立,那么-1轉(zhuǎn)化后就是11,3轉(zhuǎn)化后也為11,現(xiàn)在假如需要現(xiàn)在的把這個(gè)數(shù)二進(jìn)制數(shù)再轉(zhuǎn)化為十進(jìn)制,那么我們?nèi)绾沃涝瓉?lái)的是正數(shù)還是負(fù)數(shù)呢,假如要轉(zhuǎn)化為十六進(jìn)制,八進(jìn)制又當(dāng)如何呢?經(jīng)過(guò)以上的分析我們發(fā)現(xiàn),還應(yīng)該有另外一個(gè)參數(shù)——二進(jìn)制時(shí)的寬度,只有這樣才能知道誰(shuí)是最高位,因此我們就稱這個(gè)參數(shù)為位寬。
    最后,設(shè)計(jì)類。根據(jù)第二步的分析,因?yàn)槲粚拰?duì)每一個(gè)方法都是一樣,所以可能把它作為類的成員變量,而另外兩個(gè)參數(shù)轉(zhuǎn)化前的值和轉(zhuǎn)化后的值就分別作為輸入?yún)?shù)和返回值。而類對(duì)外的接口只有各個(gè)轉(zhuǎn)化的方法,因此這幾個(gè)方法設(shè)計(jì)為public權(quán)限,而其它所有的輔助方法都為PRivate權(quán)限。位寬通過(guò)構(gòu)造函數(shù)傳遞,外部不能直接訪問(wèn)和修改,設(shè)置也設(shè)置為private權(quán)限。為了減少計(jì)算量,所有的轉(zhuǎn)化都以二進(jìn)制為中介。例如十六進(jìn)制到十進(jìn)制,是十六進(jìn)制→二進(jìn)制→十進(jìn)制。
   2、編碼。經(jīng)過(guò)第一步的簡(jiǎn)單設(shè)計(jì)后就可以開(kāi)始編碼了。關(guān)于編碼中的具體問(wèn)題就不再說(shuō)明,可以代碼內(nèi)的注釋。代碼只包含類中一部分。

public class Convertion {

  /**
   * 當(dāng)前的存儲(chǔ)位寬
   */
  private int bitWidth;

  /**
   * 構(gòu)造函數(shù),設(shè)置當(dāng)前系統(tǒng)的位寬。
   * @param bitWidth int 位寬
   */
  public Convertion(int bitWidth) {
    this.bitWidth = bitWidth * 8;
  }



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 特克斯县| 西安市| 平塘县| 西乌珠穆沁旗| 工布江达县| 凤山市| 巴林右旗| 自贡市| 湖州市| 贵港市| 松溪县| 尉氏县| 葫芦岛市| 肇源县| 庆城县| 宾阳县| 忻州市| 拉萨市| 鄂伦春自治旗| 朝阳市| 德钦县| 秀山| 沂水县| 新源县| 武川县| 论坛| 松桃| 昆明市| 大悟县| 岳阳县| 阿瓦提县| 晴隆县| 井冈山市| 济源市| 高淳县| 阿图什市| 广水市| 长兴县| 陈巴尔虎旗| 金堂县| 贵德县|