Delphi面向對象編程的20條規則

Delphi面向對象編程的20條規則

作者簡介????
? Marco?? Cantu是一個知名的Delphi專家,他曾出版過《精通Delphi》系列叢書,《Delphi開發手冊》以及電子書《精通Pascal》(該電子書可在網上免費獲得)。他講授的課題是Delphi基礎和高級開發技巧。你可以通過他的網站(www.marcocantu.com)獲得更多關于他的信息,你也可以他的公共新聞組和他聯系,詳情請參見他的網站。????
???
? 前言????
? 大多數Delphi程序員都像使用Visual?? Basic?? 那樣使用他們手頭上開發工具,而絲毫沒有意識到Delphi的強大功能,更談不上使用這些功能了。(寫到這里,編輯惶恐的舉起了手,怎么可能呢?)Delphi和Visual?? Basic不同,Delphi完全建立在面向對象結構上,這不僅影響到VCL的結構,而且影響到使用Delphi開發的每一個程序。????
? 在本文中,我不想涉及到面向對象編程(OOP)的所有理論,只是提出一些簡單的經驗規則。希望這些規則能夠幫助改善你的程序結構。無論你開發的是何種類型的程序,這些經驗規則都是適用的。你應當把他們當作一些建議,記住他們并把他們應用到你開發的程序中去。????
? 關于面向對象編程,我想強調的一個關鍵原理是封裝。我們都希望創建一些靈活而且強健的類,因為這樣的類允許我們以后修改他們的實現方法而不影響到程序中的其他部分,這正是封裝給我們帶來的好處。雖然封裝不是創建一個好的面向對象程序的唯一標準,但是它構成了面相對象編程的基礎,所以在本文中我也許會過多的強調封裝性,請不要感到奇怪,我有足夠充分的理由這么做。????
? 最后,我想說明這樣一個事實:本文將主要集中說明窗體(Forms)的開發(雖然其中的一些規則對于組件的開發同樣適用),因此這些規則對于所有的Delphi程序員都是適用的。那些編寫組件的程序員必須把面相對象編程和類(Class)作為核心的元素,但是對于那些使用組件編程的程序員,他們時常會忘記面向對象。對于他們,本文可以當作一個提示,提醒他們始終記住面向對象編程????
???
? 第一部分:窗體是類(A?? Form?? is?? A?? Class)(rule?? 1-rule?? 15)????
? 程序員常常將窗體看作是對象,而事實上窗體是類。兩者的差別在于你創建基于相同的窗體類的多個窗體對象。令人感到疑惑的是Delphi為你定義的每一個窗體類創建了一個默認的全局對象。這對于新手來說是相當方便的,但是這同樣會使他們形成壞習慣。????
???
? 第二部分:繼承(Inheritance)(rule?? 15-rule?? 20)????
? 在講述了一系列關于類特別是關于窗體類的規則后,第二部分將是一些關于類的繼承性以及可視化窗體繼承的建議和技巧。????
???
? 關于代碼????
? 本文中所有的代碼段都可以在本期雜志(《The?? Delphi?? Magazine》?? Issue?? 47)附帶的磁盤中的OopDemo工程中找到。你特別應該查看例程中的frm2?? 單元(unit)和inher單元。如果你想使用這些代碼,請注意構造器必要的初始化設置以及私有組件參照,同時有必要設置好窗體的OldCreateOrder屬性。否則,帶有組件的窗體構造器的初始化代碼將在窗體的OnCreate事件之前得到執行。????
? 在這張磁盤上你還可以找到OOP?? 窗體向導的第一版的編譯包,不過我更希望你訪問我的網站獲得該程序的更完整的版本。????
? 規則一:為每一個類創建一個單元(One?? Class,One?? Unit)????
? 請始終牢記這一點:類的私有(private)和保護(protected)的部分只對于其他單元中的類和過程(procedure)才是隱藏的.因此,如果你想得到有效的封裝性,你應該為每一個類使用一個不同的單元。對于一些簡單的類,比如那些繼承其他類的類,你可以使用一個共享的單元。不過共享同一個單元的類的數目是受到限制的:不要在一個簡單的單元里放置超過20個復雜的類,雖然Borland公司的VCL代碼曾經這樣做過。????
? 如果你使用窗體的時候,Delphi會默認的遵循“一個類使用一個單元”的規則,這對于程序員來說也是十分方便的。當你向你的項目中添加一個沒有窗體的類時,Delphi也會創建一個新的獨立的單元。????
???
? 規則二:為組件命名(Name?? Components)????
? 為每一個窗體和單元給出一個有意義的名字是十分重要的。窗體和單元的名字必須是不同的,不過我趨向于為他們兩者使用相似的名字,如對于關于窗體和單元可以為他們使用AboutForm?? 和About.pas.????
? 為組件使用帶有描述性的名字同樣十分重要。最常見的命名方式是使用類的小寫字母開頭,再加上組件的功能,如BtnAdd?? 或者editName。采用這樣的命名方式為組件命名可能會有很多相似的名字,而且也沒有一個最好的名字,到底應該選擇那一個應該依據你的個人愛好而定。????
???
? 規則三:為事件命名(Name?? Events)????
? 對于事件處理方法給出合適的名字更加重要。如果你對于組件給出了一個合適的名字,那么系統默認的名字ButtonClick將變成BtnAddClick。雖然從這個名字中我們可以猜到這個事件處理程序的功能,但是我認為使用一個能夠描述該方法的作用的名字,而不是采用Delphi附加的名字是一種更好的方式。例如,BtnAdd按鈕的OnClick事件可以命名成AddToList。這會使得你的程序可讀性更強,特別是當你在這個類的其他方法中調用這個事件處理程序時,而且這會幫助程序員為類似的事件或是不同的組件選用相同的方法。不過我必須聲明,使用動作(Actions)是目前開發重要的程序時我最喜歡的方法。????
???
? 規則四:使用窗體方法(Use?? Form?? Methods)????
? 窗體都是一些類,因此窗體的代碼是以方法組織的。你可以向窗體中添加事件處理程序,這些處理程序完成一些特別的功能,而且他們能被其他方法調用。除了事件處理方法外,你還可以向窗體添加完成動作的特別定義的方法以及訪問窗體狀態的方法。在窗體中添加一些公共的(Public)方法供其他窗體調用要比其他窗體直接操作他的組件要好。????
???
? 規則5:添加窗體構造器(Add?? Form?? Constructors)????
? 在運行時創建的第二個窗體除了一個默認的構造器(從Tcomponent?? 類繼承而來)外還會提供其他特殊的構造器。如果你不需要考慮和Delphi4以前的版本的兼容性問題,我建議你重載(Overload)Create方法,添加必要的初始化參數。具體代碼可參見下面的代碼:????
? Public????
? Constructor?? Create(Text:string):?? reintroduce?? ;?? overload;????
? Constructor?? TformDialog.Create(Text:string);????
? Begin????
? Inherited?? Create(Application);????
? Edit1.Text:=Text;????
? End;????
? 規則6:避免全局變量(Avoid?? Global?? Variables)????
? 應該避免使用全局變量(就是那些在單元的interface?? 部分定義的變量)。下面將會有一些建議幫助你如何去做。????
? 如果你需要為窗體存儲額外的數據,你可以向窗體類中添加一些私有數據。這種情況下,每一個窗體實例都會有自己的數據副本。你可以使用單元變量(在單元的implementation部分定義的變量)聲明那些供窗體類的多個實例共享的數據。????
? 如果你需要在不同類型的窗體之間共享數據,你可以把他們定義在主窗體里來實現共享,或者使用一個全局變量,使用方法或者是屬性來獲得數據。????
???
? 規則7:永遠不要在Tform1類中使用Form1(Never?? Use?? Form1?? in?? Tform1)????
? 你應該避免在類的方法中使用一個特定的對象名稱,換句話說,你不應該在TForm1類的方法中直接使用Form1.如果你確實需要使用當前的對象,你可以使用Self關鍵字。請牢記:大多數時候你都沒有必要直接使用當前對象的方法和數據。????
? 如果你不遵循這條規則,當你為一個窗體類創建多個實例的時候,你會陷入麻煩當中。????
???
? 規則8:盡量避免在其他的窗體中使用Form1(Seldom?? Use?? Form1?? In?? Other?? Forms?? )????
? 即使在其他窗體的代碼中,你也應該盡量避免直接使用全局變量,如Form1.定義一些局部變量或者私有域供其他窗體使用會比直接調用全局變量要好。????
? 例如,程序的主窗體能夠為對話框定義一個私有域。很顯然,如果你計劃為一個派生窗體創建多個實例,這條規則將是十分有用。你可以在主窗體的代碼范圍內保持一份清單,也可以更簡單地使用全局Sreen對象的窗體數組。????
???
? 規則9:移除Form1(Remove?? Form1)????
? 事實上,我的建議是在你的程序中移除Delphi自動創建的全局窗體對象。即使你禁止了窗體的自動添加功能,這也有可能是必要的,因為在Delphi隨后仍然可能添加這樣的窗體。我給你的建議是應該盡量避免使用全局窗體對象。????
? 我認為對于Delphi新手而言,移除全局窗體對象是十分有用的,這樣他們不至于對類和全局對象兩者的關系感到疑惑。事實上,在全局窗體對象被移除后,所有與它有關的代碼都會產生錯誤。??
???
? 問題點數:0、回復次數:112Top

1 樓ZyxIp(絕望中...)回復于 2003-09-02 14:28:22 得分 0
規則10:添加窗體屬性(Add?? Form?? Properties)????
? 正如我已經提到過的,當你需要為你的窗體添加數據時,請添加一個私有域。如果你需要訪問其他類的數據,可以為你的窗體添加屬性。使用這種方法你就能夠改變當前窗體的代碼和數據(包含在它的用戶界面中)而不必改變其他窗體或類的代碼。????
? 你還應該使用屬性或是方法來初始化派生窗體或是對話框,或是訪問他們的最終狀態。正如我前文所說的,你應該使用構造器來完成初始化工作????
???
? 規則11:顯示組件屬性(Expose?? Components?? Properties)????
? 當你需要訪問其他窗體的狀態時,你不應該直接訪問它的組件。因為這樣會將其他窗體或其它類的代碼和用戶界面結合在一起,而用戶界面往往是一個應用程序中最容易發生改變的部分。最好的方法是,為你需要訪問的組件屬性定義一個窗體屬性。要實現這一點,可以通過讀取組件狀態的Get方法和設置組件狀態的Set方法實現。????
? 假如你現在需要改變用戶界面,用另外一個組件替換現有的組件,那么你只需做的是修改與這個組件屬性相關的Get方法和Set方法,而不必查找,修改所有引用這個組件的窗體和類的源碼。詳細實現方法請參見下面的代碼:????
? private????
? function?? GetText:String;????
? procedure?? SetText(const?? Value:String);????
? public????
? property?? Text:String;????
? read?? GetText?? write?? SetText;????
? function?? TformDialog.GetText:String;????
? begin????
? Result:=Edit1.Text;????
? end;????
? procedure?? TformDialog.SetText(const?? Value:String);????
? begin????
? Edit1.Text;=Value;????
? end;????
???
? 規則12:屬性數組(Array?? Properties)????
? 如果你需要處理窗體中的一系列變量,你可以定義一個屬性數組。如果這些變量是一些對于窗體很重要的信息,你還可以把他們定義成窗體默認的屬性數組,這樣你就可以直接使用SpecialForm[3]來訪問他們的值了。????
? 下面的代碼顯示了如何將一個listbox組件的項目定義成窗體默認的屬性數組。????
? type????
? TformDialog?? =class(TForm)????
? private????
? listItems:TlistBox;????
? function?? GetItems(Index:Integer):String;????
? procedure?? SetItems(Index:Integer:const?? Value:String);????
? public????
? property?? Items[Index:Integer]:string;????
? end;????
? function?? TFormDialog.GetItems(Index:Integer):string;????
? begin????
? if?? Index?? >=ListItems.Items.Count?? then????
? raise?? Exception.Create(‘TformDialog:Out?? of?? Range’);????
? Result:=ListItems.Items[Index];????
? end;????
? procedure?? TformDialog.SetItems(Index:Integer;const?? alue:string);????
? begin????
? if?? Index?? >=ListItems.Items.Count?? then????
? raise?? Exception.Create(‘TformDialog:Out?? of?? Range’);????
? ListItems.Items[Index]:=Value;????
? end;????
???
? 規則13:使用屬性的附加作用(Use?? Side-Effects?? In?? Properties)????
? 請記住:使用屬性而不是訪問全局變量(參見規則10、11、12)的好處之一就是當你設置或者讀取屬性的值時,你還可能有意想不到的收獲。????
? 例如,你可以直接在窗體界面上拖拉組件,設置多個屬性的值,調用特殊方法,立即改變多個組件的狀態,或者撤銷一個事件(如果需要的話)等等。????
???
? 規則14:隱藏組件(Hide?? Components)????
? 我經常聽見那些面向對象編程的狂熱追求者抱怨Delphi窗體中包含一些在published部分聲明的組件,這是和面向對象思想的封裝性原理不相符合的。他們確實提出了一個重要的議題,但是他們中的大多數人都沒有意識到解決方法其實就在他們手邊,完全不用重寫Delphi代碼,也不用轉向其他語言。????
? Delphi向窗體中添加的組件參照可以被移到private部分,使得其他窗體不能訪問他們。如果你這樣做,你就有必要設置一些指向組件的窗體屬性(請參見規則11),并且使用它們來訪問組件的狀態。????
? Delphi將所有的這些組件都放在published部分,這是因為使用這種方式能夠保證這些域一定是在.DFM文件中創建的組件。當你改變一個組件的名稱時,VCL能夠自動地將這個組件對象與它在窗體中的參照關聯起來。因為delphi使用RTTI和Tobject方法來實現這種功能,所以如果想要使用這種自動實現功能,就必須把參照放置在published部分(這也正是為什么delphi將所有的組件都放在published部分的緣故)。????
? 如果你想知道的更詳細一點,可以參看下面的代碼:????
???
? procedure?? Tcomponent.SetReference(Enable:Boolean);????
? var????
? Field:^Tcomponent;????
? begin????
? If?? Fowner<>?? nil?? then?? begin????
? Field:=Fowner.FieldAddress(Fname);????
? If?? Field<>nil?? then????
? Field^:=Self????
? else????
? Field^:=nil;????
? end;????
? end;????
???
? 上面的代碼是Tcomponent類的SetReference方法,這個方法可以被InserComponent,RemoveComponent和SetName等方法調用。????
? 當你理解了這一點后,你應該不難想到如果你將組件參照從published部分移到了private段,你將失去VCL的自動關聯功能。為了解決這個問題,你可以通過在窗體的OnCreate事件中添加如下代碼解決:????
? Edit1:=FindComponent(‘Edit1’)?? as?? Tedit;????
? 你接下來應該做的就是在系統中注冊這些組件類,當你為他們注冊過后就能使RTTI包含在編譯程序中并且能夠被系統所使用。當你將這些類型的組件參照移到private部分時,對于每一個組件類,你只需為他們注冊一次。即使為他們注冊不是一定必要的時候,你也可以這樣做,因為對于RegisterClasses的額外調用有益無害。通常你應該在單元中負責生成窗體的初始化部分添加以下的代碼:????
? RegisterClass([TEdit]);????
???
? 規則15:面向對象編程的窗體向導(The?? OOP?? Form?? Wizard)????
? 為每一個窗體的每一個組件重復上述兩個操作不僅十分的煩人,而且相當的浪費時間。為了避免額外的負擔,我已經為此寫了一個簡單的向導程序。這個程序將會生成一些可以完成以上兩步工作的代碼,你需要做的僅僅是做幾次復制和粘貼就行了。????
? 遺憾的是這個向導程序不能自動將代碼放置到單元中合適的地方,我目前正在修改這個向導程序,希望能實現這個功能。你可以到我的網站(www.marcocantu.com)查找更加完善的程序。????
???
? 規則16:可視化窗體繼承(Visual?? Form?? Inheritance)????
? 如果應用得當,這將是一個強大的工具。根據我的經驗,你所開發的項目越大,越能體現它的價值。在一個復雜的程序中,你可以使用窗體的不同等級關系來處理一組相關窗體的多態性(polymorphism)。????
? 可視化窗體繼承允許你共享多個窗體的一些公共的動作:你可以使用共享的方法,公用的屬性,甚至是事件處理程序,組件,組件屬性,組件事件處理方法等等。????
???
? 規則17:限制保護域數據的使用(Limit?? Protected?? Data)????
? 當創建一些具有不同分級體系的類時,一些程序員趨向于主要使用保護域,因為私有數據不能被子類訪問。我不能說這沒有其合理性,但是這肯定是和封裝性不相容和的。保護數據的實現能夠被所有繼承的窗體所共享,而且一旦這些數據的原始定義發生改變,你必須更改所有的相關部分。????
? 請注意,如果你遵循隱藏組件這樣一條規則(Rule?? 14),繼承窗體就不可能訪問基類的私有組件。在一個繼承窗體中,類似Edit1.Text:=’’的代碼就不會被編譯。雖然這是相當的不方便,但是至少在理論上這是值得肯定的事情,而不是否定的。如果你感覺到實現封裝性是最主要,最需要的,就請將這些組件參照放在基類的私有段。????
???
? 規則18:保護域中的訪問方法(Protected?? Access?? Methods)????
? 在基類中將組件參照放置在私有域中,而為這些組件添加一些訪問函數來得到他們的屬性,這將是一種更好的方法。如果這些訪問函數僅僅在這些類內部使用而且不是類接口的一部分,你應該在保護域聲明他們。例如Rule?? 11中描述過的GetText和SetText方法就可以聲明成protected,并且我們可以通過調用SetText(’’)來編輯文本。????
? 事實上,當一個方法被鏡像到一個屬性時,我們可以簡單地采用如下代碼就可以達到編輯文本地目的:Text:=’’;????
???
? 規則19:保護域中的虛擬方法(Protected?? Virtual?? Methods)????
? 實現一個靈活的分級制度的另一個關鍵點是定義一些你可以從外部類調用的虛擬方法來得到多態性。如果這個方法使用得當,將會很少出現其他公共的方法調用保護域中的虛擬方法的情況。這是一個重要的技巧,因為你可以定制派生類的虛擬方法,來修改對象的動作。????
???
? 規則20:用于屬性的虛擬方法(Virtual?? Methods?? For?? Properties)????
? 即使是訪問屬性的方法也能定義成virtual,這樣派生類就能改變屬性的動作而不必重定義他們。雖然這種方法在VCL當中很少使用,但是它確實十分靈活、強大。為了實現這一點,僅僅需要將Rule?? 11當中的Get?? 和Set?? 方法定義成Virtual。基類的代碼如下所示:????
? type????
? TformDialog?? =?? class?? (?? TForm)????
? Procedure?? FormCreate(Sender:Tobject);????
? Private????
? Edit1:Tedit;????
? Protected????
? function?? GetText:String;virtual;????
? procedure?? SetText(const?? Value:String);virtual;????
? public????
? constructor?? Create(Text?? :String):reintroduce;overload;????
? property?? Text:String?? read?? GetText?? write?? SetText;????
? end;????
???
? 在繼承窗體中,你可以添加一些額外的動作來重載虛擬方法SetText:????
? procedure?? TformInherit.SetText(const?? Value:String);????
? begin????
? inherited?? SetText(Value);????
? if?? Value=’’?? then????
? Button1.Enabled:=False;????
? end;

轉載于:https://www.cnblogs.com/bjxsky/articles/2816842.html

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

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

相關文章

制動失靈怎么辦?

定義 制動過程中&#xff0c;由于制動器某些零部件的損壞或發生故障&#xff0c;使運動部件(或運動機械)不能保持停止狀態或不能按要求停止運動的現象。 制動失靈的原因 制動失靈的關鍵在于制動系統無法對汽車施加足夠的制動力&#xff0c;包括制動液管路液位不足或進入空氣、制…

OpenDDS用idl生成自定義數據類型時遇到的一個問題

問題&#xff1a;這里會提示LNK2005重復定義的錯誤 解決方案&#xff1a; 解決后&#xff1a;

解決:Connect to xx.xx.xxx.xx :8081 [/xx.xx.xx.xx] failed: Connection refu sed: connect -> [H

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 自行啟動了個 Nenux 服務。想把本地工程推送到 個人私服&#xff0c;執行命令&#xff1a;mvn deploy 報錯&#xff1a; Failed to…

ADOQuery 查詢 刪除 修改 插入

//利用combobox組件查詢數據庫表procedure TForm1.Button1Click(Sender: TObject);beginADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add(select * from trim(ComboBox2.Text));ADOQuery1.Active:true;end&#xff1b; //查詢記錄procedure TForm1.Button1Click(Sender…

防爆胎,有妙招

對于大多數人來說&#xff0c;買車難,養車更難。許多人擁有了新車&#xff0c;卻沒有足夠的知識去好好保養汽車&#xff0c;這實在是非常可惜。如何做好汽車的保養工作,讓我們的愛車更好的為我們工作&#xff1f;夏天熾熱的天氣&#xff0c;是否讓你為爆胎煩惱不已&#xff1f;…

Qt之QProcess(一)運行cmd命令

Qt提供了QProcess類&#xff0c;QProcess可用于完畢啟動外部程序&#xff0c;并與之交互通信。 一、啟動外部程序的兩種方式&#xff1a; &#xff08;1&#xff09;一體式&#xff1a;void QProcess::start(const QString & program, const QStringList & arguments…

Docker 方式安裝 Nexus 私服

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 從Docker 官方倉庫查找鏡像&#xff1a; docker search nexus 2. 拉取鏡像&#xff1a; docker pull 你選中的鏡像的名字  pull…

shader飛線改進版

項目github地址&#xff1a;https://github.com/ecojust/flyline 前面寫過一個飛線(基于THREE.Line進行的顏色變化)&#xff0c;只是簡單地將可視區片元顏色的alpha通道值設為1.0&#xff0c;不在可視區的設為0.0。效果是這樣的&#xff1a; 做得很粗糙&#xff0c;而且因為線是…

轉向盤失控怎么辦?

定義 轉向失控就是方向盤不管用了&#xff0c;打方向盤&#xff0c;但是前輪不動&#xff0c;不受方向盤控制。 轉向失控的原因 轉向失控可能因為車輛過快、酒駕、疲勞、車況不佳、雨雪路滑等&#xff0c;還有轉向機構中有零部件脫落、損壞、卡滯時&#xff0c;也會使轉向機構突…

Socket網絡編程【獲取本機IP】

//12.3.2//運行環境VS2013//獲取本地IP #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")void main() { // 調用WSAStarup初始化WINsock庫 WSADATA wsaData; ::WSAStartup( MAKEWORD(2,2), &wsaData);// 存放主機名的…

onresize

1 window.onresize function (ev) { 2 console.log(尺寸發生改變&#xff01;); 3 }; 4 5 window.addEventListener(resize, function (ev) { 6 console.log(尺寸發生改變&#xff01;); 7 }); 1 /*2 當屏幕的寬度>960時&#xff0c;頁面的背景顏色為紅色…

Vuejs:組件 slot 內容分發

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 本文是在官方文檔的基礎上&#xff0c;更加細致的說明&#xff0c;代碼更多更全。 簡單來說&#xff0c;更適合新手閱讀 &#xff08;…

C++獲取本機所有ip地址,可區分類型是有線無線虛擬機還是回環

一個小程序&#xff0c;可以獲取本地所有ip地址&#xff0c;包括有線&#xff0c;無線&#xff0c;虛擬機&#xff0c;環回接口網卡&#xff0c;等。 如圖&#xff0c;一臺機器多個網卡&#xff1a; 程序執行結果&#xff1a; #include"stdio.h" #include"…

頓悟人生十一句話

一、永遠不要埋怨你已經發生的事情 如果你打算忍受一件事情就閉上嘴巴吧。要么就改變它&#xff0c;要么就安靜的接受它。 二、最讓你忿忿不平的問題&#xff0c;就是你需要解決的問題 一個被酒后駕駛的司機撞死自己兒子的婦女&#xff0c;發起了反對酒后駕駛母親協會…

Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用mybatis可以逆向生成pojo和mapper文件有很多種方式&#xff0c;我以前用的是mybtais自帶的generator包來生成&#xff0c;連接如下&…

控制臺程序隱藏方法總結(四種)

學習計算機&#xff0c;往往先從Windows環境下學習編程&#xff0c;學習編程&#xff0c;往往從C學起&#xff0c;學習C&#xff0c;往往又從控制臺程序學習&#xff0c;何為控制臺&#xff0c;就是那個黑框白字的界面。對于這樣一個最初認為奇陋無比而現在認為無所不能的編程平…

十大教養,讓你氣度非凡!

01.守時 無論是開會、赴約&#xff0c;有教養的人從不遲到。他們懂得&#xff0c;即使是無意遲到&#xff0c;對其他準時到場的人來說&#xff0c;也是不尊重的表現。 02.談吐有節 注意從不隨便打斷別人的談話&#xff0c;總是先聽完對方的發言&#xff0c;然后再去反駁或者補…

mybatis :Criteria 查詢、條件過濾用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;hibernate 中也有 Criteria 的用法&#xff0c;見另一文章&#xff1a;jpa : criteria 作排除過濾、查詢 1. 包&#xf…

C++11多線程----線程管理

說到多線程編程&#xff0c;那么就不得不提并行和并發&#xff0c;多線程是實現并發&#xff08;并行&#xff09;的一種手段。并行是指兩個或多個獨立的操作同時進行。注意這里是同時進行&#xff0c;區別于并發&#xff0c;在一個時間段內執行多個操作。在單核時代&#xff0…

揭秘賺錢的技巧,學會讓錢自己進來

學習把負債變為資產 貧窮是一種習慣&#xff0c;而不只是口袋里金錢的多寡。 每個人每天的時間是相同的&#xff0c;有人利用它來打工&#xff0c;賺取約80新臺幣的工資。也有人將時間用來教書&#xff0c;每小時賺取約500新臺幣&#xff0c;也有人用這些時間來上網&#xff0c…