《重構-改善既有代碼的設計》-第1例:租賃影片(1)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

買了《重構 - 改善既有代碼的設計?》一書,一直沒有好好看,大致過了下也覺得只是有點點印象而已,最后還是決定把代碼敲一次,記錄一下這些學習過程。

?

第一例:租賃影片

程序說明:顧客租了哪些影片,租期多長,根據租賃時間和影片類型算出費用和積分。

1. 分解并重組statement()?

原代碼如下有3個類。?

?

package bean;
/*** 租賃訂單* @author Administrator*/
public class Rental {private Movie _movie ; // 影片private int _daysRented; // 租賃天數public Rental(Movie _movie, int _daysRented) {this._movie = _movie;this._daysRented = _daysRented;}public Movie getMovie() {return _movie;}public int getDaysRented() {return _daysRented;}}

?

package bean;/*** 影片* @author Administrator*/
public class Movie {public static final int CHILDRENS = 2;  // 兒童片public static final int REGULAR = 0; // 普通片public static final int NEW_RELEASE = 1; // 新片private String _title;private int _priceCode;public Movie(String _title, int _priceCode) {this._title = _title;this._priceCode = _priceCode;}public int getPriceCode() {return _priceCode;}public void setPriceCode(int _priceCode) {this._priceCode = _priceCode;}public String getTitle() {return _title;}}

?

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){double thisAmount = 0; // 租金Rental each = (Rental)rentals.nextElement();// 確定每種片子的租金switch(each.getMovie().getPriceCode()){case Movie.REGULAR:thisAmount += 2;if(each.getDaysRented() > 2 ){thisAmount += (each.getDaysRented() - 2) * 1.5;}break;case Movie.NEW_RELEASE:thisAmount += each.getDaysRented()*3;break;case Movie.CHILDRENS:thisAmount += 1.5;if(each.getDaysRented() > 3 ){thisAmount += (each.getDaysRented() - 3) * 1.5;}break;}// 增加積分frequentRenterPoints ++;// 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(thisAmount)+"\n";totalAmount += thislAmount;}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}}


1.1 抽離switch 語句到獨立方法

1.1.1 Customer類改為:

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){double thisAmount = 0; // 租金Rental each = (Rental)rentals.nextElement();thisAmount = amountFor(each); // 計算租金// 增加積分frequentRenterPoints ++; // 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(thisAmount)+"\n";totalAmount += thisAmount;}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}// 計算租金private int amountFor(Rental each){int thisAmount = 0; // 租金// 確定每種片子的租金switch(each.getMovie().getPriceCode()){case Movie.REGULAR:thisAmount += 2;if(each.getDaysRented() > 2 ){thisAmount += (each.getDaysRented() - 2) * 1.5;}break;case Movie.NEW_RELEASE:thisAmount += each.getDaysRented()*3;break;case Movie.CHILDRENS:thisAmount += 1.5;if(each.getDaysRented() > 3 ){thisAmount += (each.getDaysRented() - 3) * 1.5;}break;}return thisAmount;}}

?

?

1.1.2 注意?amountFor 方法的返回類型應該是double類型:

?Customer類改為:

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){double thisAmount = 0; // 租金Rental each = (Rental)rentals.nextElement();thisAmount = amountFor(each); // 計算租金// 增加積分frequentRenterPoints ++; // 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(thisAmount)+"\n";totalAmount += thisAmount;}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}// 計算租金private double amountFor(Rental each){double thisAmount = 0; // 租金// 確定每種片子的租金switch(each.getMovie().getPriceCode()){case Movie.REGULAR:thisAmount += 2;if(each.getDaysRented() > 2 ){thisAmount += (each.getDaysRented() - 2) * 1.5;}break;case Movie.NEW_RELEASE:thisAmount += each.getDaysRented()*3;break;case Movie.CHILDRENS:thisAmount += 1.5;if(each.getDaysRented() > 3 ){thisAmount += (each.getDaysRented() - 3) * 1.5;}break;}return thisAmount;}}


1.3 ?變量名稱應該見名知意:好的代碼應該清楚的表達出自己的功能,變量名稱是代碼清晰的一個關鍵。

?

amountFor方法中局部變量 thisAmount , 參數each 要改名。

改變量名 ,?Customer類改為:

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){double thisAmount = 0; // 租金Rental each = (Rental)rentals.nextElement();thisAmount = amountFor(each); // 計算租金// 增加積分frequentRenterPoints ++; // 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(thisAmount)+"\n";totalAmount += thisAmount;}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}// 計算租金private double amountFor(Rental aRental){double result = 0; // 租金// 確定每種片子的租金switch(aRental.getMovie().getPriceCode()){case Movie.REGULAR:result += 2;if(aRental.getDaysRented() > 2 ){result += (aRental.getDaysRented() - 2) * 1.5;}break;case Movie.NEW_RELEASE:result += aRental.getDaysRented()*3;break;case Movie.CHILDRENS:result += 1.5;if(aRental.getDaysRented() > 3 ){result += (aRental.getDaysRented() - 3) * 1.5;}break;}return result;}}

?

?

1.4 函數應該放在它所使用的數據所屬的對象中, 顧客租金的計算應該移動到Rental類中去。

?

?

?

Rental 類改為 : ?(計算租金方法去掉參數并改名 )

?

package bean;
/*** 租賃訂單* @author Administrator*/
public class Rental {private Movie _movie ; // 影片private int _daysRented; // 租賃天數public Rental(Movie _movie, int _daysRented) {this._movie = _movie;this._daysRented = _daysRented;}public Movie getMovie() {return _movie;}public int getDaysRented() {return _daysRented;}// 計算租金double getCharge(){double result = 0; // 租金// 確定每種片子的租金switch(getMovie().getPriceCode()){case Movie.REGULAR:result += 2;if(getDaysRented() > 2 ){result += (getDaysRented() - 2) * 1.5;}break;case Movie.NEW_RELEASE:result += getDaysRented()*3;break;case Movie.CHILDRENS:result += 1.5;if(getDaysRented() > 3 ){result += (getDaysRented() - 3) * 1.5;}break;}return result;}}


原顧客類中amountFor方法直接調用計算租金方法即可,Customer 類改為:

?

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){double thisAmount = 0; // 租金Rental each = (Rental)rentals.nextElement();thisAmount = amountFor(each); // 計算租金// 增加積分frequentRenterPoints ++; // 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(thisAmount)+"\n";totalAmount += thisAmount;}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}// 計算租金private double amountFor(Rental aRental){return aRental.getCharge();}}


1.5 ?去掉舊函數amountFor,直接調用新函數getCharge。Customer類改為 :?

?

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){double thisAmount = 0; // 租金Rental each = (Rental)rentals.nextElement();thisAmount = each.getCharge(); // 計算租金// 增加積分frequentRenterPoints ++; // 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(thisAmount)+"\n";totalAmount += thisAmount;}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}}


1.6 ?盡量去掉臨時變量,臨時變量會導致大量參數的傳遞,沒有必要。 thisAmount 是個多余的臨時變量,直接去掉。

?

Customer?改為:

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){Rental each = (Rental)rentals.nextElement();// 增加積分frequentRenterPoints ++; // 新片+租賃時間達2天  積分+1 if(each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1){frequentRenterPoints ++;}// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(each.getCharge())+"\n";totalAmount += each.getCharge();}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}}

?

1.7 把積分計算方法放到Rental類中,寫為常客積分計算方法(getFrequentRenterPoints),并改變Customer類中積分計算代碼 。

?

Rental類改為:

?

package bean;
/*** 租賃訂單* @author Administrator*/
public class Rental {private Movie _movie ; // 影片private int _daysRented; // 租賃天數public Rental(Movie _movie, int _daysRented) {this._movie = _movie;this._daysRented = _daysRented;}public Movie getMovie() {return _movie;}public int getDaysRented() {return _daysRented;}// 計算租金double getCharge(){double result = 0; // 租金// 確定每種片子的租金switch(getMovie().getPriceCode()){case Movie.REGULAR:result += 2;if(getDaysRented() > 2 ){result += (getDaysRented() - 2) * 1.5;}break;case Movie.NEW_RELEASE:result += getDaysRented()*3;break;case Movie.CHILDRENS:result += 1.5;if(getDaysRented() > 3 ){result += (getDaysRented() - 3) * 1.5;}break;}return result;}// 常客積分計算int getFrequentRenterPoints(){// 增加積分int frequentRenterPoints =0;frequentRenterPoints++; // (新片+租賃時間達2天  積分+1 )if(getMovie().getPriceCode() == Movie.NEW_RELEASE && getDaysRented() > 1){frequentRenterPoints ++;}return frequentRenterPoints;}}


Customer類中statement方法改為:

?

?

/*** 生成訂單* @return*/public String statement(){double totalAmount = 0; // 總租金 int frequentRenterPoints = 0; // 積分Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){Rental each = (Rental)rentals.nextElement();// 積分frequentRenterPoints += each.getFrequentRenterPoints();// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(each.getCharge())+"\n";totalAmount += each.getCharge();}// 頁腳result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";result +="You eared "+String.valueOf(frequentRenterPoints)+"frequent renter points";return result;}

?

1.8 去掉statement方法中的2個臨時變量:totalAmount 和?frequentRenterPoints 。抽離出對應計算方法,并調用。

?

Customer?類改為:

?

package bean;import java.util.Enumeration;
import java.util.Vector;/*** 顧客* @author Administrator*/
public class Customer {private String _name; // 顧客名字private Vector _rentals = new Vector();  // 租賃訂單數組public Customer(String name) {super();this._name = name;}public void addRental(Rental arg){_rentals.addElement(arg);}public String getName() {return _name;}/*** 生成訂單* @return*/public String statement(){Enumeration rentals = _rentals.elements();String result = "Rental Record for "+ getName() + "\n";while( rentals.hasMoreElements()){Rental each = (Rental)rentals.nextElement();// 本次租賃記錄說明result += "\t"+each.getMovie().getTitle()+"\t"+ String.valueOf(each.getCharge())+"\n";}// 頁腳result +="Amount owed is "+ String.valueOf(getTotalCharge())+"\n";result +="You eared "+String.valueOf(getTotalFrequentRenterPoints())+"frequent renter points";return result;}// 計算總積分private int getTotalFrequentRenterPoints(){int result = 0;Enumeration rentals = _rentals.elements();while(rentals.hasMoreElements()){Rental each = (Rental)rentals.nextElement();result += each.getFrequentRenterPoints();}return result;}// 計算總租金private double getTotalCharge(){double result = 0;Enumeration rentals = _rentals.elements();while(rentals.hasMoreElements()){Rental each = (Rental)rentals.nextElement();result += each.getCharge();}return result;}}

?

本步改寫作用說明:

?

?這里雖然從1個循環變為3個,但是多了2個查詢函數。

1) ?使得Customer 類中的任何代碼都可以調用這些查詢函數。

2) ?若系統其它部分需要這些信息,也可以輕松地將查詢函數加入?Customer 類接口。而若沒有這些查詢波函數,其它函數就必須了解 ?Rental 類,并自行建立循環。

?

?

1.9 加功能:打印憑條。

statement 方法改為 htmlStatement :

?

?

/*** 生成訂單(打印憑條)* @return*/public String htmlStatement(){Enumeration rentals = _rentals.elements();String result = "<P><H1>Rentals for <EM> "+ getName() + "</EM></H1></P>\n";while( rentals.hasMoreElements()){Rental each = (Rental)rentals.nextElement();// 本次租賃記錄說明result += each.getMovie().getTitle()+":"+ String.valueOf(each.getCharge())+"<BR>\n";}// 頁腳result +="<P>You owe <EM>"+ String.valueOf(getTotalCharge())+"</EM></P>\n";result +="<P> on this rental you earned <EM> "+String.valueOf(getTotalFrequentRenterPoints())+"</EM> frequent renter points </P>";return result;}

?

?

?

?

?

未完,見 ?:?重構-改善既有代碼的設計-第1例:租賃影片(2)

?

?

?

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451631.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java類加public和不加public

加public表示全局類&#xff0c;該類可以import到任何類內。不加public默認為保留類&#xff0c;只能被同一個包內的其他類引用。

STL數據結構

STL數據結構 1.priority_queue #include<queue> pritority<int>q;(大根堆) priority_queue<int,vector<int>,greater<int> >q;(小根堆) struct no{ int x,v; bool operator <(const no &T)const{return v>T.v;} // v值xiao的優先 }; q…

《netty實戰》閱讀筆記(2)——Netty 的數據容器ByteBuf

ByteBuffer 當我們進行數據傳輸的時候&#xff0c;往往需要使用到緩沖區&#xff0c;常用的緩沖區就是JDK NIO類庫提供的java.nio.Buffer。 實際上&#xff0c;7種基礎類型&#xff08;Boolean除外&#xff09;都有自己的緩沖區實現&#xff0c;對于NIO編程而言&#xff0c;我們…

JAVA HASHMAP 用法

import java.util.HashMap;public class Student { String name; String sex; public Student(String n,String s) { namen; sexs; } public String toString(){ return ("姓名:"name"\n""性別:"sex"\n…

有了二叉查找樹、平衡樹為啥還需要紅黑樹?

參考文章&#xff1a; 有了二叉查找樹、平衡樹為啥還需要紅黑樹&#xff1f; 漫畫AVL樹 謝謝作者分享&#xff01;

32位Windows7上8G內存使用感受+xp 32位下使用8G內存

我推薦做開發的朋友:趕快加入8G的行列吧....呵呵..超爽...速度超快...基本沒有等待的概念...深有體會... 為什么要使用8G內存&#xff1f;在國內外各大論壇上&#xff0c;這都是一個有爭議的問題。問題的反方論據非常充分&#xff1a; 除了少數專業領域&#xff0c;大多數應用程…

《重構-改善既有代碼的設計》-第1例:租賃影片(2)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 上接 重構-改善既有代碼的設計-第1例&#xff1a;租賃影片&#xff08;1&#xff09; 2 運用多態取代與價格相關的條件邏輯 2.1 最好不…

elasticsearch 的查詢 /_nodes/stats 各字段意思

/_nodes/stats 字段意思 “” 1 { 2 "_nodes": {3 "total": 1,4 "successful": 1,5 "failed": 06 },7 "cluster_name": "ELKTEST",8 "nodes": {9 "lnlHC8yERCKXCuAc…

看完Java的動態代理技術——Pythoner笑了

Java的動態代理常用來包裝原始方法調用&#xff0c;用于增強或改寫現有方法的邏輯&#xff0c;它在Java技術領域被廣為使用&#xff0c;在阿里的Sofa RPC框架序列化中你能看到它的身影&#xff0c;Hibernate的實體類功能增強也是以動態代理的方式解決的&#xff0c;還有Spring吹…

shell實現從1加到100

#!/bin/bash # test"while do done"PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATHsum0 for i in $(seq 1 100); do let sumi done echo "The sum is > $sum "

面試常考的數據結構Java實現

1、線性表 2、線性鏈表 3、棧 4、隊列 5、串 6、數組 7、廣義表 8、樹和二叉樹 二叉樹&#xff1a;每個結點至多只有兩棵子樹&#xff08;即二叉樹中不存在度大于2的結點&#xff09;&#xff0c;并且&#xff0c;二叉樹的子樹有左右之分&#xff0c;其次序不能任意顛倒。 二叉…

Java5線程并發庫之LOCK(鎖)CONDITION(條件)實現線程同步通信

為什么80%的碼農都做不了架構師&#xff1f;>>> Lock&#xff08;鎖&#xff09;&Condition&#xff08;條件&#xff09;實現線程同步通信 接下來介紹&#xff0c;java5線程并發庫里面的鎖。跟鎖有關的類和接口主要是位于java.util.concurrent.locks包。 Lock…

互聯網,可預見的未來

我記憶中的1998年代&#xff0c;PC迅猛發展&#xff0c;CPU速度逐年翻番&#xff0c;持續了7年&#xff0c;但下一個7年到現在&#xff0c;基本上沒有太大提升&#xff1b;顯示器從14英寸CRT發展到2005的21英寸LED&#xff0c;后來也沒有繼續進化。為什么&#xff1f;當人對計算…

什么時候用GET?什么時候用POST?

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、 GET和POST兩種方法都是將數據送到服務器&#xff0c;但你該用哪一種呢&#xff1f; HTTP標準包含這兩種方法是為了達到不同的目的…

邏輯運算符與邏輯表達式

1 #include <stdio.h>2 3 int main()4 {5 int a0;int b0;6 if(a&&b)//a&&ba的邏輯值為0&#xff0c;則執行else7 {8 printf("a&&b is true\n");9 } 10 else 11 { 12 printf("a&&…

linux/shell相關知識點

阿里Linux Shell腳本面試25個經典問答 Linux運維工程師12道面試題整理 感謝作者分享&#xff01;

20180601]函數與標量子查詢2.txt

[20180601]函數與標量子查詢2.txt --//昨天看http://www.cnblogs.com/kerrycode/p/9099507.html鏈接,里面提到: 通俗來將&#xff0c;當使用標量子查詢的時候&#xff0c;ORACLE會將子查詢結果緩存在哈希表中&#xff0c; 如果后續的記錄出現同樣的值&#xff0c;優化器通過緩存…

ODP 使用 ArrayBind 時可能會遇到的巨坑 'System.IConvertible' 的解決方法

Unable to cast object of type System.Nullable1[System.Int16][] to type System.IConvertible 一段代碼99%不會出錯&#xff0c;0.1%會報上邊的錯&#xff0c;debug費了老鼻子時間&#xff0c;發現此坑很深。異常是 cmd.ExecuteNonQuery() 拋的&#xff0c;實際是 para.Valu…

eclipse快速定位到錯誤處

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程 以前都是按著滾動條往下拉&#xff0c;找到錯誤的地方&#xff0c;有時比較多的時候就很麻煩。 其實eclipse是可以直接快速定位的&#x…

C語言中的“”和“”

先說左移,左移就是把一個數的所有位都向左移動若干位,在C中用<<運算符.例如: int i 1; i i << 2; //把i里的值左移2位 也就是說,1的2進制是000...0001(這里1前面0的個數和int的位數有關,32位機器,gcc里有31個0),左移2位之后變成 000...0100,也就是10進制的4,所以…