コンテンツにスキップ

メソッド ( máy tính khoa học )

Xuất xứ: フリー bách khoa sự điển 『ウィキペディア ( Wikipedia ) 』

メソッド(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 となるインスタンス (レシーバ) をthisselfといったキーワード (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ốobjectAobjectBに đại nhập している. こ の khi điểm で,objectAobjectBの インスタンス変 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ệ ではobjectAobjectBそれぞれ の インスタンスオブジェクトに đố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 ではstaticTâ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()メソッドによりClassHình オブジェクトを lấy được できる. また,クラス danh.classという cấu văn でClassHình オブジェクトを lấy được することもできる. さらにリフレクションを sử うことで,ClassHình オブジェクトからメソッドを hô び ra したり, フィールドにアクセスしたりすることもできる.

.NET FrameworkではメタクラスとしてSystem.Typeクラスをサポートする.System.Object.GetType()メソッドによりTypeHình オブジェクトを lấy được できる. C#ではtypeofTính toán tử により hình シンボルからTypeHì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 であり, メソッドにvirtualTâ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 であり,finalTâ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 む ) にvirtualTâ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 のfinalTân trang tử は, パフォーマンス thượng の lý do というよりはむしろ, đẻ ra クラスで の không cần ý なオーバーライドを cấm してバグを chưa xảy ra に phòng ngừa することにある. “JavaではメソッドをfinalTâ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].なお,OracleHotSpotVMは,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#ではabstractTân trang tử を dùng いて trừu tượng メソッドを tuyên ngôn できる. Trừu tượng メソッドを cầm つクラス tự thể もまた, tất ずabstractTâ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 である.

ただし,PHPPerlの ように,プログラミング 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]
  1. ^MFC,COM,.NET Frameworkではメソッドという dùng từ が sử われる.
  2. ^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 している.
  3. ^Lệ えばSmalltalkでは "#addSelector:withMethod:" により đã tồn の メソッドにセレクターを thêm vào できる.[1]またメッセージ転 đưaにより số nhiều の メッセージを một つ の メソッドで chịu け lấy ることができる.
  4. ^C++において,obj.staticMemberFunc()の ようにインスタンスから tĩnh メンバー quan số を hô び ra すVỏ bọc đường cấu vănはサポートされるが, クラス tự thể をオブジェクトとして tráp うことはできない.
  5. ^abJavaにおけるメソッド thở ra し の sĩ tổ み | Java Magazine | Oracle
  6. ^Performance Tips and Tricks in.NET Applications | Microsoft Docs
  7. ^Writing Faster Managed Code: Know What Things Cost | Microsoft Docs
  8. ^パフォーマンスに quan するヒント | Android デベロッパー | Android Developers,Internet Archive
  9. ^Java の lý luận と thật tiễn: ファイナル・アンサー? finalキーワードを có hiệu に sử dụng するため の ガイドライン | IBM,Internet Archive
  10. ^Java の lý luận と thật tiễn: パフォーマンス の đô thị vân nói | IBM,Internet Archive
  11. ^プロパティ - C# プログラミング ガイド | Microsoft Docs
  12. ^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 である.
  13. ^そ の ほか, 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
  14. ^Properties (Delphi) - RAD Studio”.docwiki.embarcadero.2023 năm ngày 13 tháng 10Duyệt lãm.

Quan liền hạng mục

[Biên tập]