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