メソッド ( máy tính khoa học )
メソッド(method) あるいはメンバー quan số(-かんすう,member function) とはオブジェクト chỉ hướng プログラミングNgôn ngữにおいて, あるクラスまたはオブジェクトに tương ứng するサブルーチンを chỉ す.
Điểm chính
[Biên tập]オブジェクト chỉ hướng プログラミングにおけるメソッドという dùng từ は nguyên 々SmalltalkによってSimulaのメンバープロシージャー(member procedure) をメッセージとメソッドに phân けるために dẫn vào された.C++ではメンバー quan sốと hô ばれるが, これはSimula の メンバープロシージャーをC ngôn ngữに lưu dùng したことに ngọn nguồn している.Javaの ような ngôn ngữ やマイクロソフト[1]など の xí nghiệp がメソッドという dùng từ を sử っている の は,Nguyên 々C++よりもSmalltalk の ảnh hưởng を chịu けていたためである[Muốn xuất xứ].Năm gần đây[いつ?]では ngôn ngữ thiết kế やOS khai phát chờ で trực tiếp Smalltalk の ảnh hưởng を chịu けていない trường hợp でも, Javaやマイクロソフト chờ の ảnh hưởng によりメンバープロシージャーやメンバー quan số に đương たるも の をメソッドと hô ぶことが chung chung している.
SmalltalkやSmalltalk の đặc sắc を sắc nùng く chịu け継いだObjective-Cでは, メッセージとメソッドを minh xác に sử い phân けている.[2]
メッセージとメソッドが phân かれている ngôn ngữ では1 cái の メソッドに đối しセレクターが dị なる số nhiều の メッセージを đưa ることができる. こ の ためメンバー quan số hình の ngôn ngữ と vi いメッセージとメソッド の chia lìa を cường く ý thức しておく tất yếu がある. [3]
メソッドと thông thường の quan số の vi いは chủ にインスタンスBên trong へ の アクセス の có vô である. クラスに tương ứng するフィールドおよびメソッドにはそれぞれアクセシビリティ ( アクセスレベル ) を giả thiết することができ, アクセス権がないコード lĩnh vực からは tham chiếu したり hô び ra したりすることができない. こ の cơ năng は thông thườngカプセル hóaと hô ばれており,クラスĐịnh nghĩa のTrừu tượng hóaに cống hiến する. また hô び ra し khi に thao tác の đối tượng となるインスタンス (レシーバ) をthis
やself
といったキーワード (Dư ước ngữ), あるいはメソッドに độ されたDẫn sốによって tham chiếu することができる.
C++ではクラスに thuộc さない quan số であるĐại vực quan số( グローバル quan số あるいはフリー quan số ) と đối so されることがある.
またメソッドはサブクラスHóa の tế にオーバーライドされることがあり, thật tế に phát sinh する động tác ( chấn る vũ い ) がレシーバに sống nhờ vào nhau するという đặc trưng を cầm つ. これをNhiều thái tính( ポリモーフィズム ) と hô ぶ.
Thống nhất モデリング ngôn ngữ(UML) ではメソッド の ことをThao tác(operation) と hô ぶ.
インスタンスメソッドとクラスメソッド
[Biên tập]インスタンスメソッド(instance method) とはインスタンスに thuộc するメソッド の ことであり, インスタンスに đối しメッセージを truyền tin する sự で thật hành される. インスタンス変 số の thao tác に sử われ, インスタンスメソッドはオブジェクト chỉ hướng プログラミング の trung hạch をなし, もっともよく sử われる.
Một phương,クラスメソッド(class method) とはクラスに thuộc するメソッド の ことであり, クラスに đối しメッセージを truyền tin する sự で thật hành される. クラス変 số の thao tác やオブジェクト の sinh thành などに sử われる. Nhiều く の オブジェクト chỉ hướng ngôn ngữ はメタクラスをサポートしており, クラスオブジェクト の thao tác thủ đoạn となる.C++やJavaといったオブジェクト chỉ hướng ngôn ngữ ではTĩnh メンバー quan sốあるいはTĩnh メソッド(static method) とよばれ, そ の chấn る vũ いはクラス変 số の thao tác が cho phép される điểm を trừ き phi オブジェクト chỉ hướng ngôn ngữ におけるQuan sốやプロシージャと変わらない.
インスタンスメソッドとクラスメソッド の lệ
[Biên tập]Smalltalkによる lệ
[Biên tập]Smalltalkによるインスタンスメソッドとクラスメソッド の lệ を kỳ す.
Object
subclass:#MethodSample
instanceVariableNames:'name'"インスタンスオブジェクトに cầm たせるインスタンス変 số"
classVariableNames:''"クラスオブジェクトとクラスオブジェクト trực thuộc の インスタンスオブジェクト の gian で cùng sở hữu するクラス変 số"
poolDictionaries:''"クラスオブジェクトとインスタンスオブジェクト の gian で cùng sở hữu するプール変 số"
category:'Example'.
"インスタンスオブジェクト の インスタンス変 số を thao tác するメソッド(インスタンスメソッド)"
MethodSamplemethodsFor:'accessing'
!
givenName
^name.
!
givenName:aString
name:=aString.
!!
"インスタンスオブジェクトとクラスオブジェクトを thao tác するメソッド(インスタンスメソッド)"
MethodSamplemethodsFor:'inter-accessing'
!
name
^selfgivenName,' ',selfclassfamilyName.
!!
MethodSampleclassinstanceVariableNames:'name'."クラスオブジェクトに cầm たせるインスタンス変 số"
"クラスオブジェクト の インスタンス変 số を thao tác するメソッド(クラスメソッド)"
MethodSampleclassmethodsFor:'accessing'
!
familyName
^name.
!
familyName:aString
name:=aString.
!!
MethodSampleclassmethodsFor:'instance creation'
!
withGivenName:aString
^self
new
givenName:aString;
yourself.
!!
インスタンスメソッドを thật hành するには, まずインスタンスオブジェクトを sinh thành しなければならない:
|objectA objectB|
objectA:=MethodSamplewithGivenName:'John'.
objectB:=MethodSamplewithGivenName:'Joe'.
Thượng の lệ では#withGivenName:
により nhị つ の インスタンスオブジェクトを sinh thành し変 sốobjectA
とobjectB
に đại nhập している. こ の khi điểm で,objectA
とobjectB
の インスタンス変 sốname
にはそれぞれ "John" と "Joe" が đại nhập されている.
インスタンスメソッドを thật hành するには thứ の ように ghi lại する:
objectAgivenName."'John' を phản す"
objectBgivenName."'Joe' を phản す"
Thượng の lệ ではobjectA
とobjectB
それぞれ の インスタンスオブジェクトに đối し#givenName
メッセージを đưa りインスタンスメソッドを thật hành している. それぞれ の メソッド の phản り trị が dị なることから, cùng じクラスオブジェクトに thuộc するインスタンスオブジェクトでもインスタンス変 số が cầm つ trị は, インスタンスオブジェクト mỗi に dị なることがわかる.
Một phương, クラスメソッドを thật hành するには, クラスオブジェクトに trực tiếp thuộc しているため, インスタンスオブジェクト の đại わりにクラスオブジェクトに đối してメッセージを đưa る. クラスメソッドを thật hành するには thứ の ように ghi lại する:
type:=MethodSample
typefamilyName:'Hillton'.
typefamilyName."'Hillton' を phản す".
Thượng の lệ ではtype
にクラスオブジェクトMethodSample
を đại nhập して,#familyName
と#familyName:
メッセージを đưa りクラスメソッドを thật hành している.
クラスオブジェクト の インスタンス変 sốname
は, インスタンスオブジェクト の インスタンス変 số と dị なりMethodSample
に thuộc する toàn て の インスタンスオブジェクトで cùng sở hữu される.
クラスオブジェクト の インスタンス変 số が cùng sở hữu される lệ を kỳ す:
|type objectA objectB|
type:=MethodSample
objectA:=typewithGivenName:'John'.
objectB:=typewithGivenName:'Joe'.
"#nameはクラスオブジェクトに#familyNameを đưa っているため, dị なるインスタンスオブジェクトでも'Hillton'が cùng sở hữu されている."
typefamilyName:'Hillton'.
objectAname."'John Hillton'を phản す"
objectBname."'Joe Hillton'を phản す"
クラスメソッドは, 変 số に đại nhập せず trực tiếp クラス danh を chỉ định して hô び ra すことが nhiều い. Đặc にクラスがオブジェクトではない ngôn ngữ においては, trực tiếp クラス danh を chỉ định する thư き phương しかできない.
Trực tiếp クラス danh を chỉ định したクラスメソッド の hô び ra しは thứ の ように ghi lại する:
MethodSamplefamilyName:'Hillton'.
MethodSamplefamilyName."'Hillton' を phản す".
なお,MethodSample
の インスタンスオブジェクト sinh thành するときに sử dụng したnew
もクラスメソッドである.
Giống nhau にインスタンスオブジェクトを sinh thành する trường hợp にはnew
という đặc biệt な tính toán tử を dùng いる ngôn ngữ が nhiều い. しかし, Smalltalk の ảnh hưởng が cường い ngôn ngữ やRuby chờ いくつか の ngôn ngữ ではクラスメソッドによりインスタンスオブジェクトを sinh thành する. クラスメソッドによりインスタンスオブジェクトを sinh thành する ngôn ngữ の trường hợp,new
を một mình の thật trang に変 càng することができる. Lệ えばnew
を thật hành したとき, đừng の クラスオブジェクトに thuộc するインスタンスオブジェクトを phản すようにすることができる. C++ の ようにnew
が tính toán tử でありながら, クラスメソッド ( tĩnh メンバー quan số ) としてnew
を định nghĩa できる ngôn ngữ もある.
クラスがオブジェクトになっている ngôn ngữ の trường hợp, インスタンスもクラスも cùng じオブジェクトとして tráp われるため, インスタンスメソッドとクラスメソッドでメッセージ の đưa り phương に khác nhau はない. インスタンスメソッド の đại わりにクラスメソッドを hô び ra すことも, クラスメソッド の đại わりにインスタンスメソッドを hô び ra すこともできる. どちら の メソッドを hô び ra すかは, メッセージを đưa った変 số にインスタンスとクラス の うち, どちら の オブジェクトを đại nhập していたかで quyết まる.
Nhiều く の ngôn ngữ ではインスタンスメソッドとクラスメソッドは cùng じシグネチャ(signature: Danh trước と dẫn số ) を định nghĩa できる. SmalltalkやObjective-Cなどメッセージが tồn tại する ngôn ngữ ではメソッド の nhiều trọng định nghĩa ができないため vừa thấy vô lý なように thấy えるが, メソッドが tương ứng するオブジェクトがインスタンスとクラスで dị なるため, cùng の シグネチャでインスタンスメソッドとクラスメソッドを định nghĩa することができる.
Javaによる lệ
[Biên tập]Javaで ghi lại したインスタンスメソッドと tĩnh メソッド ( クラスメソッド ) の lệ を kỳ す. Java ではstatic
Tân trang tử がついたメソッドが tĩnh メソッドであり, ついていなければインスタンスメソッドである.
publicclassMethodSample{
/** インスタンスフィールド */
privateStringname;
/** クラスフィールド */
privatestaticintnumber;
/** インスタンスを sinh thành するため の コンストラクタ */
publicMethodSample(finalStringname){
this.name=name;
}
/** インスタンスメソッド, getter */
publicStringgetName(){
returnthis.name;
}
/** tĩnh メソッド, getter */
publicstaticintgetNumber(){
returnMethodSample.number;
}
/** tĩnh メソッド, setter */
publicstaticvoidsetNumber(finalintnumber){
MethodSample.number=number;
}
}
Smalltalk cùng dạng インスタンスメソッドを hô び ra すには, まずコンストラクタを hô び ra してインスタンスを sinh thành しなければならない:
MethodSampleobjectA=newMethodSample("John");
MethodSampleobjectB=newMethodSample("Joe");
Thượng nhớ の lệ は, Smalltalk の lệ におけるインスタンスオブジェクト の sinh thành と cùng dạng に động tác する. C++ の vật lưu niệm を đạp tập したJavaでは,new tính toán tửによってインスタンスを sinh thành する.
インスタンスメソッドを hô び ra すには thứ の ように ghi lại する:
objectA.getName();// "John" を phản す
objectB.getName();// "Joe" を phản す
Thượng nhớ の lệ は, Smalltalk の lệ におけるインスタンスメソッド の hô び ra しと cùng dạng に động tác する.
クラスメソッドを hô び ra すには thứ の ように ghi lại する:
MethodSample.setNumber(100);
MethodSample.getNumber();// 100 を phản す
Thượng nhớ の lệ は, Ruby の lệ における trực tiếp クラス danh を chỉ định したクラスメソッド の hô び ra しと cùng dạng に động tác する.
Javaではメタクラスとしてjava.lang.Class
クラスをサポートする.java.lang.Object.getClass()
メソッドによりClass
Hình オブジェクトを lấy được できる. また,クラス danh.class
という cấu văn でClass
Hình オブジェクトを lấy được することもできる. さらにリフレクションを sử うことで,Class
Hình オブジェクトからメソッドを hô び ra したり, フィールドにアクセスしたりすることもできる.
.NET FrameworkではメタクラスとしてSystem.Type
クラスをサポートする.System.Object.GetType()
メソッドによりType
Hình オブジェクトを lấy được できる. C#ではtypeof
Tính toán tử により hình シンボルからType
Hình オブジェクトを lấy được することもできる. また, リフレクションもサポートしている.
C++はクラス hình オブジェクトやリフレクションをサポートせず, クラス tự thể を gì らか の 変 số に đại nhập するようなことはできない[4].
メッセージ truyền tin とメソッド hô び ra し
[Biên tập]オブジェクト chỉ hướng を giải thích した thư tịch などでメソッド hô び ra しについてオブジェクトにメッセージを truyền tin すると biểu hiện されることがある. C++ hệ thống の ngôn ngữ ではオブジェクト の thao tác は単なるメンバー quan số (メソッド) hô び ra しに quá ぎず so 喩として bắt えられる trường hợp が nhiều い. SmalltalkやObjective-Cにおいては, メッセージ truyền tin は単なる so 喩ではなく thật thể の ある cơ cấu であり, メソッド hô び ra しとは vật gì khác であるため chú ý が tất yếu である.
仮 tưởng メソッド, trừu tượng メソッドと cụ tượng メソッド
[Biên tập]仮 tưởng メソッド
[Biên tập]仮 tưởng メソッド(virtual method) とは,サブクラスでオーバーライド( lại định nghĩa ) し, động tác を変 càng すること の できるメソッド の ことである. C++では仮 tưởng quan sốと hô ばれる.
C++およびC#の メソッドはデフォルトで phi 仮 tưởng であり, メソッドにvirtual
Tân trang tử をつけることで仮 tưởng メソッドとすることができる. なお, C# の クラス ( tham chiếu hình ) は仮 tưởng メソッドおよび phi 仮 tưởng メソッド の lạng phương を định nghĩa することができるが,Cấu tạo thể( trị hình ) は仮 tưởng メソッドを định nghĩa することができない. Một phươngJavaの メソッド ( インスタンスメソッド ) は thường に仮 tưởng であり,final
Tân trang tử をつけることでオーバーライドを cấm できるが, phi 仮 tưởng メソッドとなるわけではない.final
メソッドを phifinal
メソッドに変 càng しても, バイナリ trao đổi tính は duy trì される[5].
仮 tưởng と phi 仮 tưởng
[Biên tập]C++では, giống nhau に仮 tưởng quan số はコンパイル khi にど の メンバー quan số を hô び ra すかを xác định できないため, thông thường の phi 仮 tưởng なメンバー quan số hô び ra しよりもパフォーマンスが ác いというデメリットがある. そ の ため, パフォーマンスを khí にするC++プログラマには, 継 thừa する tất yếu がないクラス の メンバー quan số ( đặc にデストラクタを hàm む ) にvirtual
Tân trang tử をつけることを phi thường に ngại う khuynh hướng がある. また, C++にはtemplateという cơ năng が tồn tại し,Nhiều く の trường hợp 仮 tưởng quan số はtemplateで thay thế できてしまうため仮 tưởng quan số にこだわる tất yếu がないという sự tình もある[Nghi vấn điểm ].ただし, デストラクタが phi 仮 tưởng の trường hợp, đẻ ra クラス の インスタンス の ポリモーフィックなdeleteが không có khả năng となる, という lợi liền tính および an toàn thượng の デメリットも phát sinh する.
メソッドがデフォルトで phi 仮 tưởng というC++に chuẩn ずる thiết kế tuyển 択をしたC#においても, 仮 tưởng メソッド の hô び ra しには phi 仮 tưởng メソッドよりもコストがかかることを ý niệm に trí いて lợi dụng する tất yếu がある[6][7].
Java の インスタンスメソッドは thường に仮 tưởng であるが, クラスメソッド ( tĩnh メソッド ) はオーバーライドすること の できない phi 仮 tưởng であるため, tĩnh メソッド の ほうが hô び ra しコストが tiểu さく, パフォーマンス thượng の メリットがある[8].
Java のfinal
Tân trang tử は, パフォーマンス thượng の lý do というよりはむしろ, đẻ ra クラスで の không cần ý なオーバーライドを cấm してバグを chưa xảy ra に phòng ngừa することにある. “Javaではメソッドをfinal
Tân trang することでコンパイラ の nhất thích hóa によりパフォーマンスが hướng về phía trước する” という thần thoại があるが, một phương で,Java仮 tưởng マシンの tính năng によってはメソッドをfinal
と tuyên ngôn したからといって ưu れたパフォーマンスが đến られるとは hạn らないという chỉ trích もある[9][10].なお,OracleのHotSpotVMは,final
メソッドを kiểm ra して phi thường に hiệu suất よく thật hành できるように nhất thích hóa されていると thuyết minh されている[5].
Trừu tượng メソッドと cụ tượng メソッド
[Biên tập]Trừu tượng メソッド(abstract method) とは仮 tưởng メソッド の một loại で, メソッド の thật trang が vô く, tuyên ngôn だけされているも の の ことである.C++ではThuần 粋仮 tưởng quan số(pure virtual function) と hô ばれる. こ の メソッドを lợi dụng するには, こ の メソッドを hàm むクラスを継 thừaし, そこでこ の メソッドをオーバーライドして thật trang する tất yếu がある. 従って, trừu tượng メソッドを hàm むクラスは継 thừa しない hạn りインスタンス hóa できない. こ の ようなクラスをTrừu tượng クラスと hô ぶ.
Cụ tượng メソッド(concrete method) は trừu tượng メソッド の nghịch で, thật trang をもつメソッド の ことである. Chủ に trừu tượng メソッドをオーバーライドしたインスタンスメソッド の ことを ý vị するために sử われる.
JavaおよびC#ではabstract
Tân trang tử を dùng いて trừu tượng メソッドを tuyên ngôn できる. Trừu tượng メソッドを cầm つクラス tự thể もまた, tất ずabstract
Tân trang tử を sử って trừu tượng クラスとして định nghĩa しなければならない.
Trừu tượng メソッドはデザインパターンの một つTemplate Method パターンで chủ yếu な dịch cắt を quả たす khái niệm であり, ソフトウェア の拡 trương tính,Lại lợi dụng tính,Phiếm dùng tínhを cao める の に dịch lập つ.
また, trừu tượng メソッド の みを cầm つ trừu tượng hình として, JavaおよびC#ではインターフェイス(interface) を định nghĩa できる. JavaおよびC#においてクラスは nhiều trọng 継 thừa できないが, インターフェイスを số nhiều thật trang することはできる.
オーバーライド
[Biên tập]アクセサ
[Biên tập]アクセサ(accessor) とは, đặc にオブジェクトが cầm つフィールドに gián tiếp にアクセスするために định nghĩa されるメソッド の tổng xưng である. フィールドに trị の giả thiết (set) をするメソッドをsetter, フィールドから trị の lấy được (get) をするメソッドをgetterと hô ぶ. Thường lệ, cái 々 の フィールドに đối して, cá biệt の アクセサが dụng ý される ( 2つ trở lên の フィールドをまとめて giả thiết / lấy được するようなも の は giống nhau にアクセサとは hô ばれない ). つまり, setterは単 một の nhập lực を cầm ち, getterは単 một の xuất lực を cầm つ. 1つ の フィールドに đối してsetter/getterが đối xưng に lạng phương dụng ý されることもあれば, phiến phương だけが dụng ý されることもある. Nhật Bản ngữ ではアクセサー, アクセッサあるいはアクセッサーとも vật lưu niệm する. C# 9では, オブジェクト cấu trúc khi に の み hô び ra せるinitアクセサを định nghĩa することもできる[11].
アクセサ の vật lưu niệm
[Biên tập]Nhớ pháp は ngôn ngữ により dị なる.
Java hệ thống では,getXXX,setXXXの dạng に ngữ cán bộ にアクセス đối tượng の danh từ が nhập る. Smalltalk hệ thống ではXXX,XXX:というようにアクセス đối tượng の danh trước だけを ghi lại し, nhập lực と xuất lực を dẫn số の có vô で khác nhau する. Objective-Cでは,XXX,setXXX:と phiến phương にだけsetをつける mệnh danh quy tắc が dùng いられる.DelphiやC#など の プロパティ cơ năng を cầm つ nhiều く の ngôn ngữ では, プロパティ tự thể がアクセサにあたり, chuyên dùng cấu văn を sử dụng する. Rubyでは, メソッド hô び ra し の tế の dẫn số を囲むカッコが tỉnh lược できるため, dẫn số を cầm たないメソッド hô び ra しが đọc み ra し dùng アクセサに tương đương するが, thư き込み dùng アクセサにはXXX=という cấu văn が tồn tại する. C++には quyết まった quy tắc はなくライブラリや khai phát hoàn cảnh に tả hữu される.
アクセサとRADツール
[Biên tập]アクセサが hắn の メソッドと khác nhau される đại きな lý do としてRADツール の liền huề を tưởng định していることにある. Nhiều く の RADツールでは, アクセサとして định nghĩa されたメソッドを đặc biệt tráp いし,グラフィカルユーザインタフェース(GUI) の デザイン khi にデザイン hình ảnh からアクセサ の dẫn số を chỉ định できるようになっている.
Javaには nguyên 々, get/set の chắp đầu từ を ghi lại するという quy tắc はなかったが, RAD chi viện ライブラリ のJavaBeans(java.beans) がset/getから thủy まるメソッドを trị giả thiết dùng の メソッドとして đặc biệt に tráp うため, Beansが lên sân khấu して lấy hàng, Java の クラスライブラリ toàn thể に độ ってset/get の chắp đầu từ を sử dụng する mệnh danh quy tắc が dẫn vào された. Hiện tại でも lúc đầu の danh tàn としてset/getを chắp đầu từ として cầm たないアクセサメソッドが tồn tại する (String.length()
など ).
アクセサと công khai フィールド
[Biên tập]Nhiều く の ngôn ngữ では, フィールドを công khai (public) trạng thái にすることで, オブジェクト の フィールドをメソッドを giới さず trực tiếp đọc み thư きできる. しかし, không chỉ định đa số の アプリケーションから lợi dụng されるライブラリなどではカプセル hóaの quan điểm から, thật tế にはアクセサを giới してフィールドを đọc み thư きすることがほとんどであり, フィールドを công khai trạng thái にして trực tiếp đọc み thư きすることは tránh けられる. アクセサを dụng ý することで, ライブラリ の sĩ dạng に tắc した sử い phương を cưỡng chế することができるというメリットがある.
フィールドとアクセサが1 đối 1 の trạng thái であれば, công khai trạng thái の フィールド の đọc み thư きとアクセサを giới したフィールド の đọc み thư きはほとんど変わらない. それにも quan わらず, わざわざアクセサを giới してフィールドを đọc み thư きする lý do は, アクセサ の thật trang はクラス thật trang giả の tự do であり, アクセサ (setter) が chịu け lấy った trị をどう処 lý するかはクラス の thật trang に ủy ねられるからである. Lệ えば, アクセサ (getter) が trị を phản す tế, フィールドを tham chiếu せず thường に0を phản すという thật trang も có りうる.
Công khai フィールドへ の trực tiếp アクセスと tương đối した tế の アクセサ の lợi điểm としては dưới の ようなも の がある.
- Ý đồ に setter メソッドを thật trang しないことで, フィールド の trị を phần ngoài から thắng tay に変 càng させないようにすることができる.
- Lệ えばコンストラクタで chỉ định した lúc đầu trị を thường に bảo trì し続けるイミュータブル( không 変) なクラスを định nghĩa することも khả năng となる[12].
- getter/setter でフィールドにアクセスするときにデータを gia công してから lấy được したり giả thiết したりすることができる.
- Lệ えば bên trong データ の 単 vị とは dị なる単 vị の trị に đổi して phản す, などである.
- setter でフィールドにデータを giả thiết するときにバリデーション (validation) を thật hành できる.
- Lệ えば giả thiết したいデータをSố nguyênの み,Số tự nhiênの み,Số chẵnの み, あるいは ngày phó hình thức văn tự liệt の み, などに hạn định して, phạm 囲 ngoại あるいはフォーマット ngoại の trị が độ された trường hợp に dị thường hệ とみなして ngoại lệ をスローするといった thật trang ができる.
また, アクセサを sử う nhất も quan trọng な lý do として, nhiều thái tính の ân huệ を chịu けられるという điểm がある.
Lệ えばSmalltalk の #value, #contents, #name, #sizeといったセレクターが lương い lệ である. #valueは trị を kỳ すセレクターで hạ nhớ (1) の ようにアクセサであったりアクセサでなかったり dạng 々な thật trang が tồn tại するが, #valueメッセージを đưa る tay thuận はそ の vi いを khác nhau する tất yếu が vô いため hạ nhớ (2) の ようにど の thật trang に đối しても chung の tay thuận を áp dụng することができる. これがアクセサによる nhiều thái tính の ân huệ である. アクセサを dụng ý せず trực tiếp 変 số を công khai しているクラスや, trực tiếp オブジェクト nội の 変 số を tham chiếu しているような tay thuận はこれら の 枠 tổ みから ngoại れてしまうため chung の tay thuận を sử うことはできず変 số の tham chiếu phương pháp だけが dị なる tựa たような tay thuận をいくつも làm る sự となる.
(1)
"アクセサ mục đích bên ngoài の #value"
[1]value."-> 1"
(ContinuationcurrentDo:[:sink|sinkvalue:0.] )value."-> 1"
"Thuần 粋なアクセサとして の #value"
(1)asValueHoldervalue."-> 1"
(0->1)value."-> 1"
(2)
"Chung の tay thuận"
block:=
[:valueHolder|
self
traceCr:valueHoldervalueprintString.
].
"Tay thuận の áp dụng"
blockvalue:(1)asValueHolder.
blockvalue:(0->1).
blockvalue:[1].
blockvalue:(ContinuationcurrentDo:[:sink|sinkvalue:0.] ).
#value bên ngoài の thật lệ
"アクセサ bên ngoài:1と10を nguyên に tính toán している."
(1to:10)size.
"アクセサ"
#(123)size.
"アクセサ bên ngoài:'text.txt'を toàn bộ đọc み込んだ kết quả を phản す"
'text.txt'asFileRefarencereadStreamcontents.
"アクセサ bên ngoài:self value の kết quả を phản す"
1asValueHoldercontents.
"アクセサ"
#(123)contents.
"アクセサ bên ngoài: Class danh を sinh thành して phản す."
Classname.
"アクセサ"
CmCommandnewname.
Thuần 粋なオブジェクト chỉ hướng hoàn cảnh として biết られるSmalltalkでは, アクセサによる nhiều thái tính がMVC の sống nhờ vào nhau tính sách tra cứu[Muốn nói rõ]の quản lý を thủy めあらゆる cái sở で sống dùng されている.
アクセサ luận chiến
[Biên tập]Smalltalkの ような ngôn ngữ ではインスタンスおよびクラス nội の 変 số を phần ngoài から thao tác することはできず tất ずメッセージを sử った thao tác が tất yếu となる. Một phươngC++などではpublic
変 số へ の trực tiếp thao tác が hướng 々にして lợi dụng されることがある.
- Hiệu suất の vấn đề. メソッドをいちいち hô び ra すコストを tránh けたい trường hợp. ただしほとんどはコンパイラ nhất thích hóaによるインライン hóa で giải quyết できる[13].
- Ghi lại lượng の vấn đề. 単 thuần に trị を giả thiết / lấy được するだけ の ことにToàn てメソッドを ghi lại する の は gian vi っているという khảo え phương.
Vấn đề となる の は người sau である.
まずカプセル hóaや nhiều thái tính の quan điểm から, アクセサを dùng いない変 số tham chiếu は tương lai にわたって の 変 càng bền tính や拡 trương tính が しく kém る. また nhớ pháp の nhất quán tính からアクセサを chỉ thị する hướng きもある. Một phương phủ định phái は “Cường lực なIDEを dùng いればリファクタリングは khả năng であり, むしろフィールドへ の trực tiếp アクセスを dùng いる phương が ý vị が minh xác となる” という chủ trương を triển khai し, khi にフレームに phát triển する trường hợp がある. これは hiện đại の “goto văn luận chiến”ともいうべき, nửa ば tôn giáo な đối lập quan hệ である.
そ の ほか, C++ではC ngôn ngữ と の lẫn nhau vận dụng khi にCấu tạo thểを dùng いることがあるが, cấu tạo thể の メンバー変 số は ẩn tế しないことが nhiều い. C++におけるclass
キーワードとstruct
キーワードは, デフォルト の アクセシビリティが dị なるという vi いしかないが, メンバー変 số を ẩn tế しないC ngôn ngữ trao đổi の cấu tạo thể として lợi dụng するPOD (Plain Old Data) hình を định nghĩa する tế に,class
キーワードではなくstruct
キーワードが sử われることもある.
Object Pascalはこ の tỉnh lại から, 変 số を sau からアクセサ hóa できる sĩ tổ みとしてプロパティを dẫn vào した.[14]またRubyなど, アクセサを giản 単に định nghĩa できるメソッドや cấu văn を bị えている ngôn ngữ もある.
Nhiều trọng định nghĩa
[Biên tập]Dẫn sốの số, hình, trình tự などが dị なる cùng じ danh trước の メソッドを định nghĩa することをメソッド のNhiều trọng định nghĩaといい, nhiều く の オブジェクト chỉ hướng ngôn ngữ ではメソッドやコンストラクタを nhiều trọng định nghĩa できる cơ năng を cầm つ. オーバーロード (overload) とも hô ばれるが,オーバーライドと の lẫn lộn に chú ý が tất yếu である.
ただし,PHPやPerlの ように,プログラミング ngôn ngữによっては, hình の ái muội さが nguyên nhân によりメソッドを nhiều trọng định nghĩa できないも の もある. こ の trường hợp はメソッド の dẫn số をメソッド lúc đầu で đọc み lấy り, dẫn số の hình を phán định するĐiều kiện phân kỳで đối ứng する.
Tham khảo văn hiến ・ chú thích
[Biên tập]- ^MFC,COM,.NET Frameworkではメソッドという dùng từ が sử われる.
- ^SmalltalkやObjective-Cではメッセージ転 đưaの sĩ tổ みによりオブジェクトが chịu tin したメッセージを lấy được することができる. また, Objective-Cではメソッドを thao tác するためにclass_getInstanceMethodといったMethodが phó く quan số やメソッドを cung cấp しており, メッセージを thao tác するためにはobjc_msgSendといったmsgが phó く quan số やメソッドを cung cấp している.
- ^Lệ えばSmalltalkでは "#addSelector:withMethod:" により đã tồn の メソッドにセレクターを thêm vào できる.[1]またメッセージ転 đưaにより số nhiều の メッセージを một つ の メソッドで chịu け lấy ることができる.
- ^C++において,
obj.staticMemberFunc()
の ようにインスタンスから tĩnh メンバー quan số を hô び ra すVỏ bọc đường cấu vănはサポートされるが, クラス tự thể をオブジェクトとして tráp うことはできない. - ^abJavaにおけるメソッド thở ra し の sĩ tổ み | Java Magazine | Oracle
- ^Performance Tips and Tricks in.NET Applications | Microsoft Docs
- ^Writing Faster Managed Code: Know What Things Cost | Microsoft Docs
- ^パフォーマンスに quan するヒント | Android デベロッパー | Android Developers,Internet Archive
- ^Java の lý luận と thật tiễn: ファイナル・アンサー? finalキーワードを có hiệu に sử dụng するため の ガイドライン | IBM,Internet Archive
- ^Java の lý luận と thật tiễn: パフォーマンス の đô thị vân nói | IBM,Internet Archive
- ^プロパティ - C# プログラミング ガイド | Microsoft Docs
- ^C++/Java/C# の trường hợp, イミュータブルに quan してはpublicなconst/final/readonlyフィールドで thay thế することが khả năng なケースも tồn tại する. こ の trường hợp, getterも không cần である.
- ^そ の ほか, C/C++ではコピー の コストを tránh けるため, quan số の lệ り trị ではなくポインタあるいは tham chiếu による dẫn số kinh từ で trị を phản すことがあるが, コピー tỉnh lược (copy elision) およびReturn Value Optimization (RVO) をサポートするコンパイラでは, lệ り trị で phản したとしても không cần なコピー処 lý は trừ bỏ される.コピー tỉnh lược - cppreference
- ^“Properties (Delphi) - RAD Studio”.docwiki.embarcadero.2023 năm ngày 13 tháng 10Duyệt lãm.