Yöntem (bilgisayar programlama) - Method (computer programming)

Bir usul içinde bir nesne-yönelimli programlama (OOP) a, prosedür bir ilişkili mesaj ve bir nesne . Bir nesne, veri ve davranıştan oluşur ; bunlar, nesnenin çeşitli tüketicilerinden herhangi biri tarafından nasıl kullanılabileceğini belirten bir arayüz içerir .

Veriler, nesnenin özellikleri olarak temsil edilir ve davranışlar, yöntemler olarak temsil edilir. Örneğin, bir Windownesne openve gibi yöntemlere sahip olabilirken close, durumu (zamanın herhangi bir noktasında açık veya kapalı olması) bir özellik olabilir.

Olarak sınıf tabanlı programlama yöntemler, içinde tanımlanmıştır sınıf ve nesneler örnekler , belirli bir sınıfın. Bir yöntemin sağladığı en önemli yeteneklerden biri, yöntemi geçersiz kılmadır - aynı ad (örneğin, area) birden çok farklı sınıf türü için kullanılabilir. Bu, gönderen nesnelerin davranışları çağırmasına ve bu davranışların uygulanmasını alıcı nesneye devretmesine izin verir. Java programlamada bir yöntem , bir sınıf nesnesinin davranışını ayarlar. Örneğin, bir nesne areabaşka bir nesneye mesaj gönderebilir ve alıcı nesne bir rectangle, circle, triangle, vb. olsun uygun formül çağrılır .

Yöntemler ayrıca diğer sınıfların bir nesnenin özelliklerine erişmek ve bunları değiştirmek için kullandığı arabirimi sağlar; bu, kapsülleme olarak bilinir . Kapsülleme ve geçersiz kılma, yöntemler ve prosedür çağrıları arasındaki iki temel ayırt edici özelliktir.

Geçersiz kılma ve aşırı yükleme

Yöntemi geçersiz kılma ve aşırı yükleme, bir yöntemi geleneksel prosedür veya işlev çağrısından ayıran en önemli iki yoldur . Geçersiz kılma, üst sınıfının bir yönteminin uygulanmasını yeniden tanımlayan bir alt sınıfı ifade eder. Örneğin, findAreabir şekil sınıfında tanımlanmış bir yöntem olabilir triangle, vb. her biri kendi alanını hesaplamak için uygun formülü tanımlar. Buradaki fikir, nesnelere "kara kutular" olarak bakmaktır, böylece nesnenin içindeki değişiklikler, onu kullanan diğer nesneler üzerinde minimum etki ile yapılabilir. Bu, kapsülleme olarak bilinir ve kodun bakımını ve yeniden kullanımını kolaylaştırmayı amaçlar.

Yöntem aşırı yüklemesi ise, bir mesajı işlemek için kullanılan kodun yöntemin parametrelerine göre farklılaştırılmasını ifade eder. Alıcı nesneyi herhangi bir yöntemde ilk parametre olarak görürseniz, geçersiz kılma, seçimin yalnızca ilk argümana dayandığı özel bir aşırı yükleme durumudur. Aşağıdaki basit Java örneği farkı göstermektedir:

Accessor, mutator ve manager metotları

Bir nesnenin veri değerlerini okumak için erişimci yöntemleri kullanılır. Mutator yöntemleri, bir nesnenin verilerini değiştirmek için kullanılır. Yönetici yöntemleri, bir sınıfın nesnelerini başlatmak ve yok etmek için kullanılır, örneğin yapıcılar ve yıkıcılar.

Bu yöntemler, kapsüllemeyi ve modülerliği kolaylaştıran bir soyutlama katmanı sağlar . Örneğin, bir banka hesabı sınıfı , mevcut bakiyeyi almak için (bakiye veri alanlarına doğrudan erişmek yerine) bir erişimci yöntemi sağlıyorsa , aynı kodun sonraki revizyonları , bakiye alımı için daha karmaşık bir mekanizma (örneğin, bir veritabanı) uygulayabilir. getirme), bağımlı kodun değiştirilmesi gerekmeden. Kapsülleme ve modülerlik kavramları, nesne yönelimli programlamaya özgü değildir. Aslında, birçok yönden nesne yönelimli yaklaşım, soyut veri türleri ve yapılandırılmış programlama gibi önceki paradigmaların basitçe mantıksal uzantısıdır . getBalance()

yapıcılar

Bir yapıcı nesnesi, bir işlem olarak adlandırılır oluşturmak ve başlatmak için, bir nesnenin ömrünün başlangıcında olarak adlandırılan bir yöntem yapı (veya örnekleme ). Başlatma, kaynakların edinilmesini içerebilir. Yapıcılar parametrelere sahip olabilir, ancak çoğu dilde genellikle değer döndürmez. Java'da aşağıdaki örneğe bakın:

public class Main {
    String _name;
    int _roll;

    Main(String name, int roll) { // constructor method
        this._name = name;
        this._roll = roll;
    }
}

Yıkıcılar

Bir yıkıcı bir nesnenin kullanım ömrünün sonunda otomatik olarak adlandırılan bir yöntem, adı verilen bir işlem yok . Çoğu dilde yok etme, yıkıcı yöntem argümanlarına veya dönüş değerlerine izin vermez. Nesne imhasında temizlik işleri ve diğer görevleri gerçekleştirmek için imha uygulanabilir.

Sonlandırıcılar

In çöp toplama gibi diller, Java , C # ve Python ve yok ediciler olarak bilinir finalizers . Yıkıcılara benzer bir amaç ve işleve sahiptirler, ancak çöp toplama kullanan diller ile manuel bellek yönetimine sahip diller arasındaki farklar nedeniyle, çağrıldıkları sıra farklıdır.

soyut yöntemler

Bir soyut yöntem yalnızca ile biridir imza ve hiçbir uygulama vücudun . Genellikle bir alt sınıfın yöntemin bir uygulamasını sağlaması gerektiğini belirtmek için kullanılır. Bazı programlama dillerinde arayüzleri belirtmek için soyut yöntemler kullanılır .

Örnek

Aşağıdaki Java kodu, genişletilmesi gereken soyut bir sınıfı gösterir:

abstract class Shape {
    abstract int area(int h, int w); // abstract method signature
}

Aşağıdaki alt sınıf ana sınıfı genişletir:

public class Rectangle extends Shape {
    @Override
    int area(int h, int w) {
        return h * w;
    }
}

yeniden soyutlama

Bir alt sınıf, soyut bir yöntem için bir uygulama sağlıyorsa, başka bir alt sınıf onu tekrar soyut hale getirebilir. Buna yeniden soyutlama denir .

Uygulamada, bu nadiren kullanılır.

Örnek

C#'ta sanal bir yöntem, soyut bir yöntemle geçersiz kılınabilir. (Bu, özel olmayan tüm yöntemlerin sanal olduğu Java için de geçerlidir.)

class IA
{
    public virtual void M() { }
}
abstract class IB : IA
{
    public override abstract void M(); // allowed
}

Arayüzlerin varsayılan yöntemleri de yeniden özetlenebilir ve bunları uygulamak için alt sınıflar gerekir. (Bu aynı zamanda Java için de geçerlidir.)

interface IA
{
    void M() { }
}
interface IB : IA
{
    abstract void IA.M();
}
class C : IB { } // error: class 'C' does not implement 'IA.M'.

sınıf yöntemleri

Sınıf yöntemleri, bir örnek yerine bir sınıfta çağrılan yöntemlerdir . Genellikle bir nesne meta modelinin parçası olarak kullanılırlar . Yani, her sınıf için, meta-modelde tanımlanan sınıf nesnesinin bir örneği oluşturulur. Meta model protokolleri , sınıfların oluşturulmasına ve silinmesine izin verir. Bu anlamda, yukarıda açıklanan yapıcılar ve yıkıcılar ile aynı işlevselliği sağlarlar. Ancak Common Lisp Object System (CLOS) gibi bazı dillerde meta-model, geliştiricinin çalışma zamanında nesne modelini dinamik olarak değiştirmesine izin verir: örneğin, yeni sınıflar oluşturmak, sınıf hiyerarşisini yeniden tanımlamak, özellikleri değiştirmek, vb.

Özel yöntemler

Özel yöntemler dile çok özeldir ve bir dil, burada tanımlanan özel yöntemlerin hiçbirini, bazılarını veya tümünü desteklemeyebilir. Bir dilin derleyicisi otomatik olarak varsayılan özel yöntemler oluşturabilir veya bir programcının isteğe bağlı olarak özel yöntemler tanımlamasına izin verilebilir. Çoğu özel yöntem doğrudan çağrılamaz, bunun yerine derleyici uygun zamanlarda onları çağırmak için kod üretir.

Statik yöntemler

Statik yöntemlerin, herhangi bir özel örnekten ziyade bir sınıfın tüm örnekleriyle ilgili olması amaçlanmıştır. Bu anlamda statik değişkenlere benzerler . Bir örnek, bir sınıfın her örneğinin tüm değişkenlerinin değerlerini toplamak için statik bir yöntem olabilir. Örneğin, bir Productsınıf varsa, tüm ürünlerin ortalama fiyatını hesaplamak için statik bir yöntemi olabilir.

Java'da yaygın olarak kullanılan bir statik yöntem:

Math.max(double a, double b)

Bu statik yöntemin sahip olduğu nesne yoktur ve bir örnek üzerinde çalışmaz. Tüm bilgileri argümanlarından alır.

Henüz sınıfın hiçbir örneği mevcut olmasa bile statik bir yöntem çağrılabilir. Statik yöntemlere "statik" denir çünkü bunlar , nesnenin çalışma zamanı türüne göre polimorfik olarak çözümlenen örnek yöntemlerde olduğu gibi dinamik olarak değil, çağrıldıkları sınıfa göre derleme zamanında çözümlenir.

Kopya atama operatörleri

Kopyalama atama operatörleri, aynı türdeki bir sınıf nesnesine bir sınıf nesnesi atandığında derleyici tarafından gerçekleştirilecek eylemleri tanımlar.

Operatör yöntemleri

Operatör metotları operatör sembollerini tanımlar veya yeniden tanımlar ve sembol ve ilişkili metot parametreleri ile gerçekleştirilecek işlemleri tanımlar. C++ örneği:

#include <string>

class Data {
 public:
  bool operator<(const Data& data) const { return roll_ < data.roll_; }
  bool operator==(const Data& data) const {
    return name_ == data.name_ && roll_ == data.roll_;
  }

 private:
  std::string name_;
  int roll_;
};

C++'da üye işlevleri

Bazı yordamsal diller, bu diller için büyük beceri kümelerinden ve eski koddan yararlanmak için nesne yönelimli yeteneklerle genişletildi, ancak yine de nesne yönelimli geliştirmenin faydalarını sağlıyor. Belki de en iyi bilinen örnek, C programlama dilinin nesne yönelimli bir uzantısı olan C++' dır . Varolan bir prosedürel dile nesne yönelimli paradigmayı eklemek için tasarım gereksinimleri nedeniyle, C++'da ileti geçişi bazı benzersiz yeteneklere ve terminolojilere sahiptir. Örneğin, C++'da bir yöntem, üye işlevi olarak bilinir . C ++ ayrıca kavramı vardır sanal fonksiyonları olabilir eleman fonksiyonları geçersiz kılınmış olarak türetilmiş sınıfları ve izin dinamik dağıtım .

Sanal fonksiyonlar

Sanal işlevler , bir C++ sınıfının polimorfik davranış elde edebildiği araçlardır. Sanal olmayan üye işlevler veya normal yöntemler , polimorfizme katılmayanlardır.

C++ Örneği:

#include <iostream>
#include <memory>

class Super {
 public:
  virtual ~Super() = default;

  virtual void IAm() { std::cout << "I'm the super class!\n"; }
};

class Sub : public Super {
 public:
  void IAm() override { std::cout << "I'm the subclass!\n"; }
};

int main() {
  std::unique_ptr<Super> inst1 = std::make_unique<Super>();
  std::unique_ptr<Super> inst2 = std::make_unique<Sub>();

  inst1->IAm();  // Calls |Super::IAm|.
  inst2->IAm();  // Calls |Sub::IAm|.
}

Ayrıca bakınız

Notlar

Referanslar