neden boş fonksiyon gerekli?


9

Python öğrenmeye başladım ve bir programlama dilinde boş işlevin neden gerekli olduğunu merak ediyorum

örneğin, python'da:

def empty_func():
    pass

kabuk komut dosyalarında bile boş fonksiyon boş fonksiyonlar mevcuttur.

Anladıklarım ve sorum:

  1. Programlama dilinin neden boş fonksiyonlara ihtiyacı var? Sadece programlama dili ile mi oynamak ya da gerçekten önemli olan başka bir şey için mi?

  2. Bunun bir amacı varsa, herhangi biri kullanım durumunu açıklayabilir veya boş işlevlerin kullanımına gerçek bir örnek verebilir mi?

  3. Yoksa boş fonksiyonlara izin veren programlama dilleri geleneği var mı?


EDIT (Cevaplarınızı okurken elde ettiğim şeyler):

  • Algoritma Çizimi veya Soyut Fonksiyonlar için
  • Herhangi bir işlem yapılması gerekmeyen formları göndermek için
  • Bazı zorunlu işlemler için yer tutucu

1
program yürütme bunları bulmayı / kullanmayı beklerse STUBS olarak kullanılabilirler, ancak aralarında hiçbir şey değiştirmek istemezsiniz.
G.Rassovsky

Yanıtlar:


5

Bourne ailesinin kabuk dillerinde :, hiçbir şey yapmayan komut genellikle iki durumda kullanılır:

  • Bir şeyin zorunlu bir komut beklediği durumlarda yer tutucu, ör.

    while some_condtion
    do :
    done
    

    çünkü doen az bir komut gerektirir.

  • Bağımsız değişkenleri atmak, ancak bağımsız değişken listesinde yan etkiler gerçekleştirmek, ör.

    : ${myvar=foo}

Eminim kabuk uzmanlarının bileceği başka uygulamalar da var :)

Python'da (ve diğer dillerde) daha az kullanılır. Aslında hiçbir şey yapmak istemediğinizde daha üst düzey bir işleve argüman olarak hareket edebilir. Örneğin, bir form gönderen ve gönderme tamamlandıktan sonra bir işlevin eşzamansız olarak çağrılmasına izin veren bir işleviniz olduğunu varsayalım:

def submit(callback=empty_func):
    ...

Bu şekilde, belirtilmezse callback, gönderim yine de devam eder, ancak başka işlem yapılmaz. NoneVarsayılan değer olarak kullandıysanız None, koda karmaşa ekleyerek geri aramanın açık olup olmadığını açıkça kontrol etmeniz gerekir .


1

Geliştirme döngüsünde nerede durduğunuza bağlıdır, ancak bazen bir algoritma çizerken, karmaşık blokları hemen uygulamadan soyutlama yapmak istersiniz.

def full_algo():
  init_stuff()
  process_stuff()
  ...

Nasıl init_stuffçalışacağını biliyorsunuz , kafanızda oldukça basit ama hemen buna ihtiyacınız yok, bu yüzden boş bir işlev olarak ilan ediyorsunuz. Kodunuzun kanlı ayrıntılarla uğraşmadan derlenmesini ve çalışmasını sağlar.

Serbest bırakılan uygulamalar için başka bir kullanım, kalıtım kullanılır. Platforma özgü kodun davranışını tanımlayan büyük bir sınıfınız olduğunu varsayalım. Buna benzer bir mantık ortaya çıkabilir:

init_filesystem();
access_files();
release_filesystem();

Bu kod birçok platformda çalışır, ancak bazı platformların dosya sistemi başlatılmasına gerek olmayabilir. O zaman mirasınız şöyle görünecektir (C ++ 'da = 0 ile sanal olarak türetilmiş sınıfların bu yöntemleri uygulaması ZORUNLUDUR):

class FileSystem{
  virtual void init_filesystem() = 0;
  virtual void access_files() = 0;
  virtual void release_filesystem() = 0;
};

O zaman bu sınıfın (arayüz) belirli bir uygulaması bu yöntemlerden bazıları için hiçbir şey yapamaz. Alternatif olarak, temel sınıf, init / release için sanal olarak tanımlamak yerine boş yöntemler bildirebilir.

Sonunda (ve utanç verici bir şekilde), bazen çok eski bir uygulamayı sürdürürsünüz. Yöntemleri silmenin bazı şeyleri kıracağından korkuyorsunuz. Bu, düzgün bir şekilde anlaşılmayan karmaşık kalıtımınız olduğunda veya çok sayıda işlev işaretçisi (geri aramalar) olduğunda olur. İçlerindeki kodu silersiniz, böylece hiçbir şey kırmadan yine de çağrılırlar.


0

Tamamlanmış bir programda boş bir işlevi kullanabileceğiniz zaman Rufflewind iyi bir iş çıkardı. Deneyimlerime göre, bitmemiş programlarda daha sık kullanılma eğilimindedir, böylece ne yazacağınızı planlayabilir ve gerçekten uygulamaya geçene kadar derlemesini sağlayabilirsiniz. Başka bir deyişle, genellikle sadece bir yer tutucudur.

Python durumunda gereklidir, çünkü parantez kullanan C benzeri dillerden farklı olarak blokları işaretlemek için girinti kullanır {}. Bu, eğer sahip değilseniz pass, ayrıştırıcıyı boş bırakmak isteyip istemediğinizi veya unuttuğunuzu söyleyemedi demektir. Dahil passetmek, ayrıştırıcıyı çok daha basit hale getirir ve uygulanmamış bloklar ararken aramak için uygun bir kelime sağlar.


1
Tamamlanmamış kod için, NotImplementedError"Hatalar asla sessizce geçmemelidir" ve canlı bir programda eklenmemiş bir işlevi çağırmak bir hata olduğundan , atma daha yeterli bir çözümdür.
ivan_pozdeev

Bu bağlıdır. Gönderdiğiniz kod için evet. Ancak, bir saat içinde uygulamayı beklediğiniz kodsa ve birim testlerinde çalışırken onu uygulanmamış bırakıyorsanız, hiçbir uygulamayı bırakmak daha iyi bir seçenek olmayabilir. Çoğunlukla iş akışım 1) 2) yazma saplama yöntemi pass 2) dönüş değeri test eden yazma birimi testi 3) testin başarısız olduğunu doğrulayın (yöntem tanımsız olarak döner) 4) uygulama yöntemi 5) testin şimdi geçtiğini doğrulayın
Robot

0

Python'da yapmayı beklediğiniz bir şey olmasa da, aygıt sürücülerinin dünyasında boş bir işlev sağlamanız gereken, (a) gerçekleşmeyeceğini veya ( b) Olsa bile umurumda değil.

Bunu C'de geri aramalarla da görürsünüz. Bazen, bir geri arama sağladığınız ASSUMES kodunu görürsünüz ve boş bir işaretçi riskini göz ardı ederek kodu aramaya çalışırsınız. Bu durumda yapabileceğiniz tek şey boş bir geri arama rutini sağlamaktır. (Evet, aklımda belirli bir satıcı var.)


Her passşey tamamlanmadan önce çalıştırılabilir bir şey istediğimde özellikle sınıflarda kod yazarken yer tutucu olarak çok kullandım . Gerçekten python eşdeğeri, {}parantez kullanmadığı için python yapamaz. Bu anlamda, farkında olduğum tüm diller buna izin veriyor, sadece bir çift gibi pythonbir anahtar kelime gerektiriyor. Hatta montaj günlerinde bile vardı NOP.
Robot Gort

@StevenBurnap, genellikle böyle bir şey yaptığımda, printf'in yerel eşdeğerini dahil ediyorum (">>> rutin XXX \ n" olarak adlandırılır);
John R. Strohm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.