質量屬性 可修改

 

而根據文中所講述的,一個系統的可用性主要是體如今這個系統的系統服務不中斷運行時間佔實際運行時間的比例,系統的伸縮性則是指在不改變系統軟硬件設計,僅僅經過新增服務器的狀況下,就能提高系統的處理能力,而系統的可擴展性是指該系統適應變化的能力。html

 

局部化以下前端

我本身對可修改性的理解:可修改性的理解,引發可修改性的因素,根據軟件設計原則分析對可修改性的相關戰術進行我的分析,分爲了如下幾個方面:java

 可修改性描述了程序可以被正確修改的難易程度。一個可修改的程序應當是可理解的、通用的、簡單的、靈活的。通用性是指程序適用於各類功能變化而無需修改。靈活性是指可以容易地對程序進行修改。
如下因素也會對系統的可維護性產生重要影響:

  (1)開發人員是否受過嚴格的規範化培訓。

  (2)是否採用標準化的文檔資料結構和文檔造成機制。

  (3)是否採用可維護的程序設計語言

  (4)是否有健全程序的文檔。

  (5)是否保存規範化的測試資料等。json

 

如javabean+severt+html設計模式

實現各個模塊的可修改性數據文件修改不影響其餘代碼修改,前端與後臺相隔離api

 

1. 設計網站可擴展架構的核心思想是模塊化,並在此基礎上下降模塊間的耦合性,提升模塊複用性。服務器

2. 模塊化的重要手段:分層和分割,分層、分割爲若干個低耦合的獨立組件模塊(模塊可分佈式部署,從物理上分離模塊間耦合),各模塊以消息傳遞及依賴調用方式聚合成完整系統。架構

可修改性戰術app

控制可修改性的戰術,其目標是控制實現、測試和部署變動的時間和成本。dom

1、局部化變動:維持語義的一致性;預期指望的變動;泛化該模塊;限制可能的選擇;抽象通用服務;

2、防止連鎖反應:信息隱藏;維持現有的接口;限制通訊路徑;仲裁者的使用;

3、推遲綁定時間:運行時註冊;配置文件;多態;組件更換;遵照已定義的協議;

局部性:

try-catch 情景
function loadPackage(packageName){
try{
let packageInfo = getPackageInfo(packageName);
let configPath = packageInfo.path + '/config.json';
let package = JSON.parse(fs.readFileSync(configPath));
return package;
}catch(err){
return null;
}
}

  

 

典型代碼

 

lock 情景
typedef std::map<K*,V*> Dict;
Dict dict;
Lock* lock = new Lock();

int Add(K* key, V* value){
lock->lock();
Dict::iterator it = dict.find(key);
if (it == Dict.end()){
key->AddRef();
value->AddRef();
dict.insert(std::make_pair(key, value));
}
lock->unlock();
return RESULT.SUCCESS;
}

int Remove(K* key){
lock->lock();
K* oldKey = NULL;
V* oldValue = NULL;

Dict::iterator it = dict.find(key);
if (it != dict.end()){
oldKey = it->first;
oldValue = it->second;
dict.erase(it);
}

if (oldKey){
oldKey->Release();
}

if (oldValue){
oldValue->Release();
}

lock->unlock();

return RESULT.SUCCESS;
}

V* Find(K * key){
lock->lock();

K* oldKey = NULL;
V* oldValue = NULL;

dict::iterator it = dict.find(key);
if (it != dict.end())
{
oldKey = it->first;
oldValue = it->second;
}

oldValue->AddRef();

lock->unlock();
return oldValue;
}

  

2.讀取數據,創建bean文件實現模板化的可修改性  隱藏屬性

package reci.bean;

public class wordBean {
    private int id;
    private String words;
    private String content;
    private int counts;
    public wordBean() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    public wordBean(int id, String words, String content, int counts) {
        super();
        this.id = id;
        this.words = words;
        this.content = content;
        this.counts = counts;
    }

    public int getCounts() {
        return counts;
    }

    public void setCounts(int counts) {
        this.counts = counts;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getWords() {
        return words;
    }
    public void setWords(String words) {
        this.words = words;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }

三 xml文件 利用它可不用修改代碼就能輕鬆的修改參數(推遲綁定時間)

解析 XML 文件通常來講有兩種底層形式,一種是基於樹的結構來解析的稱爲DOM;另外一種是基於事件流的形式稱爲Sax。而在這兩種解析方式的基礎上,基於底層api的更高級封裝解析器也應用而生,好比面向Java的 JDom和 Dom4J。
一、DOM(Document Object Model)
  DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點或信息片段的集合。這個層次結構容許開發人員在樹中尋找特定信息。分析該結構一般須要加載整個文檔和構造層次結構,而後才能作任何工做。因爲它是基於信息層次的,於是 DOM 被認爲是基於樹或基於對象的。
  優勢:
    ①、整個 Dom 樹都加載到內存中了,因此容許隨機讀取訪問數據。
    ②、容許隨機的對文檔結構進行增刪。
  缺點:
    ①、整個 XML 文檔必須一次性解析完,耗時。
    ②、整個 Dom 樹都要加載到內存中,佔內存。
  適用於:文檔較小,且須要修改文檔內容
<?xml version="1.0" encoding="UTF-8"?><students>    <student>        <name>Tom</name>        <age>11</age>    </student>    <student>        <name>Bob</name>        <age>22</age>    </student>    <student>        <name>Marry</name>        <age>23</age>    </student></students

  DOM 解析

import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList; public class DomParser{         /**     * 解析器讀入整個文檔,而後構建一個駐留內存的樹結構,     * 該方法返回 Document 對象,而後咱們能夠經過 這個對象來操做文檔     */    public Document getDocument(String fileName) throws Exception{        //1.建立解析工廠        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();        //2.獲得解析器        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();        //3.獲得文檔對象        Document document = dBuilder.parse(fileName);                 return document;    }         //讀取xml文檔中的數據    public void read(String fileName) throws Exception{        //獲取 Document 對象        Document document = new DomParser().getDocument(fileName);                 //獲取<name></name>的節點        NodeList nameNode = document.getElementsByTagName("name");        //獲取<name sex="xxx"></name>節點的sex屬性        Element element = (Element) document.getElementsByTagName("name").item(0);        System.out.println(element.getAttribute("sex"));//xxx                 for(int i = 0 ; i < nameNode.getLength() ;i++){            System.out.println(nameNode.item(i).getTextContent());        }        /**結果爲         * Tom         * Bob         * Marry         */                 //獲取文檔的根元素對象        Element rootElementName = document.getDocumentElement();        System.out.println(rootElementName.getNodeName()); //students                 //獲得根節點        Node root = document.getElementsByTagName(rootElementName.getNodeName()).item(0);        list(root);             }         //打印全部標籤    private void list(Node root) {        if(root instanceof Element){            System.out.println(root.getNodeName());        }        NodeList list = root.getChildNodes();        for(int i = 0 ; i < list.getLength() ; i++){            Node child = list.item(i);            list(child);        }    }         //向 xml 文件中增長節點和屬性    public void add(String fileName) throws Exception{        //獲取 Document 對象        Document document = new DomParser().getDocument(fileName);                 //建立節點        Element sex = document.createElement("sex");        sex.setTextContent("男");                 //把建立的節點添加到第一個<student></student>標籤上        Element student = (Element) document.getElementsByTagName("student").item(0);        student.appendChild(sex);                 //在<name></name>中增長屬性 <name address="xxx"></name>        Element name = (Element) document.getElementsByTagName("name").item(0);        name.setAttribute("address", "xxx");                 //把更新後的內存寫入xml文檔中        TransformerFactory tfFactory = TransformerFactory.newInstance();        Transformer tFormer = tfFactory.newTransformer();        tFormer.transform(new DOMSource(document),                new StreamResult(new FileOutputStream("src/student.xml")));    }         //向 xml 文件中刪除節點和屬性    public void delete(String fileName) throws Exception{        //獲取 Document 對象        Document document = new DomParser().getDocument(fileName);                 //獲得要刪除的第一個<name></name>節點        Element name = (Element) document.getElementsByTagName("name").item(0);        //獲得要刪除的第一個<name></name>節點的父節點        //Element student = (Element) document.getElementsByTagName("student").item(0);        //student.removeChild(name);        //上面兩步能夠簡寫爲        name.getParentNode().removeChild(name);                 //在<name></name>中刪除屬性 <name address="xxx"></name>        name.removeAttribute("address");                 //把更新後的內存寫入xml文檔中        TransformerFactory tfFactory = TransformerFactory.newInstance();        Transformer tFormer = tfFactory.newTransformer();        tFormer.transform(new DOMSource(document),                new StreamResult(new FileOutputStream("src/student.xml")));    }          //向 xml 文件中更新節點和屬性    public void update(String fileName) throws Exception{        //獲取 Document 對象        Document document = new DomParser().getDocument(fileName);                 //獲得要刪除的第一個<name></name>節點        Element name = (Element) document.getElementsByTagName("name").item(0);        //在<name></name>中更新屬性 <name address="xxx"></name>爲<name address="yyy"></name>        name.setAttribute("address", "yyy");        //更新name節點的文字爲VAE,即<name>vae</name>        name.setTextContent("vae");                 //把更新後的內存寫入xml文檔中        TransformerFactory tfFactory = TransformerFactory.newInstance();        Transformer tFormer = tfFactory.newTransformer();        tFormer.transform(new DOMSource(document),                new StreamResult(new FileOutputStream("src/student.xml")));    }}

  四 利用設計模式

好比橋接模式

 DisplayImpl類:雖然是實現層次,但倒是抽象的。

複製代碼
1 package zyr.dp.bridge;
2 
3 public abstract class DisplayImpl {
4        public abstract void rawOpen();
5        public abstract void rawPrint();
6        public abstract void rawClose();
7 }
複製代碼

 StringDisplayImpl類:

複製代碼
 1 package zyr.dp.bridge;
 2 
 3 public class StringDisplayImpl extends DisplayImpl {
 4 
 5     String name;
 6     public StringDisplayImpl(String name){
 7         this.name=name;
 8     }
 9     
10     public void rawOpen() {
11         printline();
12     }
13 
14     public void rawPrint() {
15         System.out.println("|||||"+name+"|||||");
16     }
17 
18     public void rawClose() {
19         printline();
20     }
21     private void printline(){
22         System.out.println("================");
23     }
24 
25 }
複製代碼

 Display 類:

複製代碼
 1 package zyr.dp.bridge;
 2 
 3 public  class Display {
 4        private DisplayImpl displayImpl ;
 5        public Display(DisplayImpl displayImpl){
 6          this.displayImpl=displayImpl;
 7        }
 8        public  void open(){
 9             displayImpl.rawOpen();
10        }
11        public  void print(){
12            displayImpl.rawPrint();
13        }
14        public  void close(){
15            displayImpl.rawClose();
16        }
17        public  final void display(){
18            open();
19            print();
20            close();
21        }
22 
23 }
複製代碼

 CountDisplay類:

複製代碼
 1 package zyr.dp.bridge;
 2 
 3 public  class CountDisplay extends Display {
 4 
 5     public CountDisplay(DisplayImpl displayImpl) {
 6         super(displayImpl);
 7     }
 8     public final void mutilDisplay(){
 9         open();
10         for(int i=0;i<5;i++){
11             print();
12         }
13         close();
14     }
15     
16 }
複製代碼

 Main類:

複製代碼
package zyr.dp.bridge;

public class Main {
    
    public static void main(String[] args) {
        Display display = new Display(new StringDisplayImpl("朱彥榮"));
        display.display();
        CountDisplay cd = new CountDisplay(new StringDisplayImpl("李山秀"));
        cd.display();
        cd.mutilDisplay();
    }
}
相關文章
相關標籤/搜索