代碼的味道
㈠ 代碼17129
是的,我姑娘是不太喜歡這個味道吧,每次給她都把頭別到一邊去,現在喝著優博還行,可能清淡一些
㈡ 面向對象的三大特性,請用代碼說明三大特性
面向對象(Object Oriented,縮寫為OO)是現代軟體技術的精髓。從早期的SmallTalk到如日中天的Java,都滲透著面向對象思想。
OO具有三大特性:封裝性、繼承性和多態性。想掌握面向對象思想,就必須深入理解
其三大特性。這里我盡量少談概念,只用一個生活中的例子和一段代碼來解釋它們。
1、封裝性(Encapsulation)
所謂封裝,就是將某些東西包裝和隱藏起來,讓外界無法直接使用,只能通過某些特定的方式才能訪問。OO將萬物都視為「對象」(Object),任何對象都具有特性和行為。我們將其特性稱為「成員變數」 (MemberVarible),將其行為稱之為「成員函數"(Member Function),被封裝的特性只能通過特定的行為去訪問。
大家都見過旅館里常用的一種茶葉吧,就是用紙袋把茶葉包裝起來再系是一根線。用的時候只需要將其放在水杯里泡就行。這樣的好處是不會將茶葉渣和茶垢弄的滿杯子都是。
好!這就是一個封裝的例子。
我們喝茶的目的是享受茶葉的香冽;所以茶葉的味道(Flavour)就是茶葉所具有的最
重要特性之一;可是我們無法直接享受它的清香,因為被外面的紙袋「封裝」起來了。唯一的辦法就是「泡」(Dilute),將茶袋扔在開水中泡,它的味道就出來了,融入水中。
如果我們把袋裝茶葉看作一個對象的話,它提供了成員變數Flavour和成員函數Dilute
。並且Flavour是私有(Private)的,我們不能直接把它吞進肚子去,而只能通過成員函
數Dilute才能享受Flavour。
下面用C++代碼來描述這個例子:
Class CTea
{
Private:
Cstring m_Flavour; //味道
Cstring m_Color; //顏色
...... //等等其它屬性
Private:
Void CTea(); //構造函數
Void ~CTea(); //析構函數
Public:
Cstring Dilute();//沏茶
...... //等等其它方法
}
Cstring CTea::Dilute()
{
//怎樣泡出味道來的代碼
}
這就是封裝。通過將對象的某些屬性聲明為Private隱藏起來,只能使用其提供的特定
方法去訪問。
2、繼承(Inheritance)
如果只是封裝,那麼非面向對象語言也能部分的做到。比如在C中,用結構(Struct)、
VB中用自定義類型(Type)也能封裝一些變數。
OO最有吸引力的特性是繼承。通俗的說後代具有祖先的某些特點就叫繼承,當然後代還可以具有自己獨有的特徵。舉個例子吧,菜刀。
菜刀(cutlery)是鋼(Steel)做的,鋼是一種金屬(Metal),金屬則是大千世界裡的一種物質(Substance)。所以菜刀的一些特性可以追溯到物質具有的一般屬性。正是因為這個道理,MFC中所有類均從CObject繼承而來。
這就是繼承。菜刀直接繼承了鋼的特性,鋼又繼承了金屬的特性,......下面的代碼描
述了這種復雜而有獨特的繼承關系:
Class CSubstance
{
Private:
int m_color;
void CSubstance();
void ~CSubstance();
//......(我是學文科的,具體屬性說不上來)
}
Class CMetal:Public CSubstance
{
void CMetal();
void ~CMetal();
//......
}
Class CSteel:Public CMetal
{
void CSteel();
void ~CSteel();
//......
}
Class CCutlery:Public CSteel
{
private:
Cstring m_Blade;
void CCutlery();
void ~CCutlery();
//......
Public:
void Cut();
}
這里,CSubstance被稱為基類(Base class),其它被稱為衍生類(Derived class)。衍生類與基類是「Is kind of」的關系。子類與其祖先類之間復雜的函數調用關系不在本文討論之列。
繼承是一種樹狀的層次關系。子類在繼承祖先類的成員變數和成員函數的同時也可以
定義自己的成員變數和成員函數。比如,Metal 除了繼承了Substance的一般特性外,還具有自己的屬性諸如可延展性;CCutlery在繼承CSteel的特性後還具有自己的成員諸如「刀刃」(Blade)、「鋒利」(Sharpness)、行為有如「切」(Cut)等。
面向對象技術是對現實生活的抽象,你可以用生活中的經驗去思考程序設計的邏輯。
3、多態性(Polymorphism)
討論多態之前先要明白什麼是「虛擬」(Virtual)。C++/MFC就是用虛擬這種方式實現多態的。為什麼「虛擬」這個概念?看下邊的例子:
Class Cincect //昆蟲類
{
private:
int m_foot; //腳的數量
...... //其它成員變數
private:
void Cincect();
void ~Cincect();
public:
void Bite()//咬人
{
...... //怎樣咬人的代碼,比如張開嘴啃
}
}
我把Bite(咬)這個動作在基類中定義為一般化動作。可是,不是所有昆蟲咬
人的方法都一樣(況且還有的根本就不咬人呢,比如蜻蜓),比如蚊子是用嘴那個
吸管叮人而螞蟻是用嘴去夾。
從昆蟲這個類別衍生出以下兩個類別:Cant(螞蟻)、Cmosquito(蚊子)。
class Cant :public Cincect //螞蟻類
{
......
}
class Cmosquito :public Cincect //蚊子類
{
......
}
它們都繼承了Cincect的所有成員,當然也繼承了Bite()這個動作。現在就有問題了:
同樣繼承自昆蟲,當我們使用Bite()這個動作時怎麼才能區分螞蟻和蚊子各自的獨有的咬人方式呢?
方法之一是用「::」符號指明具體引用的是那一個,但這樣明顯失去了靈活性;
另一種方法就是「虛擬」。使用關鍵字virtual將Bite()聲明為虛擬函數,然後在每個
衍生類中重新定義,描述它們各自的咬人方法,調用的時候也不會都一種結果啦。於是上邊的例子可以改寫為:
Class Cincect //昆蟲類
{
private:
int m_foot; //腳的數量
...... //其它成員變數
private:
void Cincect();
void ~Cincect();
public:
virtual Bite(){}//咬人,但我們只聲明這個成員函數,
//卻讓它什麼動作都不做,讓衍生類自己去定
//義各自的咬人方法
}
class Cant :public Cincect //螞蟻類
{
......
virtual Bite();
}
Cant::Bite()
{
...... //螞蟻具體的咬人方式
}
class Cmosquito :public Cincect //蚊子類
{
......
virtual Bite();
}
Cmosquito::Bite()
{
...... //蚊子具體的咬人方式
}
所以,虛擬的目的是只在基類中將一般化動作聲明一個成員函數的原型而不做
具體定義,讓衍生類自己去定義。
這就是面向對象的特徵之三:多態性。基類的同一個成員在不同的衍生類中可以具
有不同的形態,更好地抽象和描述大千世界中的諸多「對象」。1.了解什麼是多態性
2.如何定義一個虛方法
3.如何重載一個虛方法
4.如何在程序中運用多態性
面向對象程序設計中的另外一個重要概念是多態性。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。 可以把一組對象放到一個數組中,然後調用它們的方法,在這種場合下,多態性作用就體現出來了,這些對象不必是相同類型的對象。當然,如果它們都繼承自某個類,你可以把這些派生類,都放到一個數組中。 如果這些對象都有同名方法,就可以調用每個對象的同名方法。本節課將向你介紹如何完成這些事情。
1.清單9-1. 帶有虛方法的基類:DrawingObject.cs
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
說明
清單9-1 定義了DrawingObject類。這是個可以讓其他對象繼承的基類。該類有一個名為Draw()的方法。Draw()方法帶有一個virtual修飾符,該修飾符表明:該基類的派生類可以重載該方法。DrawingObject類的 Draw()方法完成如下事情:輸出語句"I'm just a generic drawing object."到控制台。
2.清單9-2. 帶有重載方法的派生類:Line.cs, Circle.cs, and Square.cs
using System;
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
說明
清單9-2定義了三個類。這三個類都派生自DrawingObject類。每個類都有一個同名Draw()方法,這些Draw()方法中的每一個都有一個重載修飾符。重載修飾符可讓該方法在運行時重載其基類的虛方法,實現這個功能的條件是:通過基類類型的指針變數來引用該類。
3.清單9-3. 實現多態性的程序:DrawDemo.cs
using System;
public class DrawDemo
{
public static int Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];
dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();
foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}
return 0;
}
}
說明
清單9-3演示了多態性的實現,該程序使用了在清單 9-1 和清單9-2中定義的類。在DrawDemo類中的Main()方法中,創建了一個數組, 數組元素是DrawingObject 類的對象。該數組名為dObj,是由四個DrawingObject類型的對象組成。
接下來, 初始化dObj數組, 由於Line, Circle和Square類都是DrawingObject類的派生類,所以這些類可以作為dObj數組元素的類型。 如果C#沒有這種功能,你得為每個類創建一個數組。繼承的性質可以讓派生對象當作基類成員一樣用,這樣就節省了編程工作量。
一旦數組初始化之後,接著是執行foreach循環,尋找數組中的每個元素。在每次循環中, dObj 數組的每個元素(對象)調用其Draw()方法。多態性體現在:在運行時,各自調用每個對象的Draw()方法。盡管dObj 數組中的引用對象類型是DrawingObject,這並不影響派生類重載DrawingObject 類的虛方法Draw()。 在dObj 數組中,通過指向DrawingObject 基類的指針來調用派生類中的重載的Draw()方法。
輸出結果是:
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
在DrawDemo 程序中,調用了每個派生類的重載的Draw()方法。 最後一行中,執行的是DrawingObject類的虛方法Draw()。這是因為運行到最後,數組的第四個元素是DrawingObject類的對象。
小結
現在對多態性有所了解之後,你可以在派生類中,實現一個重載基類虛方法的方法。虛方法和重載的派生類方法之間的關系就體現出C#的多態性。
㈢ 3開頭的芙蓉王味道跟5開頭的不一樣,(硬黃),編碼不一樣有什麼不同
芙蓉王編碼前面的編碼不同確實會有以下兩點的不同。
1、編碼不同,生產地點不同:
3開頭的芙蓉王是湖南煙廠生產的,5開頭的芙蓉王多是北方煙廠生產的。
2、編碼不同,味道會有不同:
3開頭的煙味比較淡,猛吸後回味感覺有一絲甜。
5開頭的煙抽起來相對沖,猛吸後回味感覺有一絲辣,更像是焦油味。
(3)代碼的味道擴展閱讀:
芙蓉王真假的鑒別:
1、假的激光防偽上面的小皇冠的線條不圓滑,而且轉動的時候要麼整個看到要麼整個看不到,真的線條圓滑,轉動的時候只看到部分的小皇冠,有的是隱藏在光環下面的。
2、再看微縮文字,大圈內側那一條小的微縮字母,假煙的單詞與單詞之間有空隙,空隙的顏色和圈的顏色是不同,區別很明顯,真煙是印在一圈上面,空隙顏色和圈的顏色是一樣的,沒有區別。
3、內部的芙蓉花做得還不錯,比原來老版的比有很大改進,不過和真的比起來還是有區別,假煙的花做得不夠立體,上面還看得到下面的幾個字母,轉動後看到芙蓉王3個字的時候,芙蓉王3個字的陰影做的不好,下面的的英文字母和上面芙蓉王幾個字的層次感不強,像是寫的一個面上一樣,而真煙的上下層次感很強,這個就要仔細的比對了。
㈣ 什麼是代碼的壞味道
壞味道一般出自《重構》一書,例如,代碼重復,過長的函數,過大的類,過長的參數列等等。
㈤ 怎麼消除JavaScript中的代碼壞味道
不要在上廁所的時候編程。:)
什麼是壞味道?
㈥ 誰有,石頭剪子布唱的夏天的味道的代碼啊
縮略句「唱的代碼」 病句 今天上語文課老師教的
㈦ 有哪些前端代碼讓你覺得堪稱絕筆
Javascript我覺得這個代碼就非常的高端,當我第一次接觸這個代碼的時候,我完全不知道他是什麼東西,裡面有很多內容我都看不懂,自從我學習了這個代碼之後,我感覺我身邊的人都非常的崇拜我。
㈧ 韓國化妝品嬋真上面的代碼是什麼意思例如:嬋真銀杏三件套上標著PY291代表什麼
嬋真產品的生產日期是用批號表示的,一般在產品上面。解釋方法如下:
第一個字母代表年份:M--代表2004年,N--代表2005年,O--代表2006年,P--代表2007年。
第二個字母代表月份:J、F、M、A、Y、E、L、U、S、O、N、D--分別代表1-12月;
後面的兩位數字則代表日期的號數。 例如:「PM07」這個批號就是表示該產品的生產日期為2007年3月7日
1、看看盒子正面,真的有嬋真特有的帶有青蛙博士的防偽雷射標簽,假的沒有。
真貨盒子上的綠色條紋離盒邊緣大概4MM左右,而假貨掌握不好這個比例,綠色條紋離盒子邊緣較大約有8MM。
盒子背面 生產日期的標注方式不一樣,真貨字體黑色較小,假貨字體淡黑色大字體。日期標注方式倒不是判斷真假的主要原因。
從盒子內部的用於覆蓋的紙板看,假洗面奶紙板上的圓孔不圓整,而真洗面奶的圓空是正圓型。
假洗面奶的紙板質地也較軟,而真洗面奶紙板質地很好,不易起皺。
真洗面奶的封口錫紙反光非常好,整個封口都非常結實,基本聞不到瓶子里產品的味道。
假洗面奶封口不牢,錫紙顏色暗淡,反光能力很差,用手摸還能感覺到瓶能滲物,能完全聞到瓶內物的味道。 (產品的味道倒是模仿的很像,也許是筆者嗅覺不靈敏*—*)
假貨的瓶蓋比較透明,基本能看清蓋里的經緯。 而真貨瓶蓋呈乳白色,基本不透明。
真的蓋子上沒有字的,假的又數字又標志什麼的。
假洗面奶的說明書,折紋不清晰,紙張較薄,嬋真株會長金光石的頭像印刷模糊,而且還有比較重的油墨味。
真洗面奶,折紋清晰,紙張乳白色較厚,印刷質量很好,頭像很清晰,基本無油墨味。
看看說明書,真的折疊得很好,假的是亂糟糟的,而且折得過界了。再看看底部的CHARMZONE。真的是有它得特色,「A」是少了一橫的。而假的是完好的「A」。
真洗面奶奶瓶末端較有明顯凹進去,而假的突出(這個方式比較好判別)。
你那個是不是假的???
㈨ 實例說明什麼是代碼的壞味道,如何重構
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//申明返回的結果是json類型
manager.responseSerializer = [AFJSONResponseSerializer serializer];
//申明請求的數據是json類型
manager.requestSerializer=[AFJSONRequestSerializer serializer];
//如果報接受類型不一致請替換一致text/html或別的
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
//傳入的參數
NSDictionary *parameters = @{@"1":@"XXXX",@"2":@"XXXX",@"3":@"XXXXX"};
//你的介面地址
NSString *url=@"http://xxxxx";
//發送請求
[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];