Programlamada “kanca” terimi ne anlama gelir?


248

Geçenlerde bazı insanlarla yazdığım bir program hakkında konuşurken "kanca" terimini duydum. Her ne kadar bir kanca bir işlev türü olduğunu konuşma çıkarımsal çıkarım rağmen bu terim ne ima emin değilim. Bir tanım aradım, ancak iyi bir cevap bulamadım. Birisi bana bu terimin genel olarak ne anlama geldiğine dair bir fikir verebilir ve belki de tanımı göstermek için küçük bir örnek verebilir mi?


3
Bkz. Hooking @ Wikipedia . Bağlantı, daha düşük oy alan cevaplardan birine gömülür.
Palec

Yanıtlar:


143

Temelde, farklı davranışlar sağlamak veya bir şey olduğunda tepki vermek için bir modüle dokunmanıza izin veren koddaki bir yerdir.


7
Bu geri aramaya benzer mi?
Chris

19
Kancalar genellikle (ancak her zaman değil) geri arama işlevlerini kullanır. Örneğin, "hookEvent (Events.STARTUP, myCallbackFunction)" kullanarak bir olay sistemini bağlayabilirsiniz. HookEvent işlevine bir işlev işaretçisi geçiriyorsunuz, böylece olay meydana geldiğinde hangi işlevi çağıracağını biliyor. Umarım yardımcı olur :-)
William Brendel

6
kesinlikle. Geri arama, "kanca" tipidir.
Micah

21
um ... hayır. Geri arama, geri aramadır ve kancalarla ilgisi yoktur, geri aramalar, kanca yöntemlerinin uygulanması için KULLANILIR. Geri aramalar işlevlere / yöntemlere / yordamlara (CALL) işaretçilerdir (RELJMP), kancalar çalışan uygulamalarda yapılan değişikliklerdir.
specializt

1
Kesme, belirtilen bir yerdeki (kesme) talimatların yürütülmesine neden olur. Kesme işlemine, örneğin kesme işleyicilerinin konumlarını listeleyen tabloyu değiştirerek kodunuzun kesme sırasında ilk önce çağrılmasını sağlayabilirsiniz (ve daha sonra kodunuz daha önce mevcut kesme işleme kodunu çağıracaktır) papatya zinciri tarzı)
David Tonhofer

77

Kanca, yazılım tarafından kullanıcıların belirli koşullar altında kendi kodlarını çağırmaları için sağlanan işlevselliktir. Bu kod geçerli kodu artırabilir veya değiştirebilir.

Bilgisayarların gerçekten kişisel ve virüslerin daha az yaygın olduğu eski günlerde (80'lerden bahsediyorum), kodunuzu çağırmak için işletim sistemi yazılımını yamalamak kadar basitti. Apple II'de Applesoft BASIC diline bir uzantı yazdığımı hatırlıyorum; bu, kodun herhangi biri işlenmeden önce koduma bir çağrı enjekte ederek BASIC yorumlayıcısına bağlandı.

Bazı bilgisayarların önceden tasarlanmış kancaları vardı, bunlardan biri Apple II'deki G / Ç akışı. Tüm disk alt sistemini enjekte etmek için böyle bir kanca kullandı (Apple II ROM'ları başlangıçta kasetlerin PC'ler için birincil depolama ortamı olduğu günlerde inşa edildi). Diskleri ASCII kodunu 4 ( ) ve ardından çalıştırmak istediğiniz komutu a yazdırarak kontrol ettiniz ve kendisini Apple ROM yazdırma rutinlerine bağlayan disk alt sistemi tarafından engellendi.CTRL-DCR

Örneğin, çizgiler:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

disk içeriğini listeleyip makineyi yeniden başlatır. Bu, ilk satırı şu şekilde ayarlayarak BASIC programlarınızı korumak gibi hilelere izin verdi:

123 REM XIN#6

sonra karakterin olduğu yere POKEeklemek için tuşunu kullanın . Ardından, kaynağınızı listelemeye çalışan herkes, disk alt sisteminin algılayacağı çıkış yordamları aracılığıyla yeniden başlatma sırasını gönderir.CTRL-DX

Bu genellikle istediğimiz davranışı elde etmek için başvurmamız gereken bir tür hiledir.

Günümüzde, işletim sistemi daha güvenli olduğunda, artık "uçuşta" veya diskte işletim sistemini değiştirmeniz gerekmediğinden, kancaların kendisi için olanaklar sağlar.

Onlar için yaklaşık oldum uzun süre. Mainframes onları (çıkış denir) vardı ve ana bilgisayar yazılımı büyük ölçüde bu tesisleri şimdi bile kullanıyor. Örneğin, z / OS (SCLM olarak adlandırılır) ile birlikte gelen ücretsiz kaynak kodu kontrol sistemi, kendi kodunuzu çıkışa yerleştirerek güvenlik alt sistemini tamamen değiştirmenize olanak tanır.


41

Genel anlamda "kanca", bir programcıya, bir sistemde / programda devam eden bir şeyi görüntülemenize ve / veya etkileşimde bulunmanıza ve / veya değiştirmenize izin veren bir şeydir.

Örneğin, Drupal CMS, geliştiricilere "içerik düğümü" oluşturulduktan sonra ek işlem yapmalarını sağlayan kancalar sağlar. Bir geliştirici bir kanca uygulamazsa, düğüm normalde oluşturulur. Bir geliştirici bir kanca uygularsa, bir düğüm oluşturulduğunda bazı ek kodları çalıştırabilir. Bu kod, geri alma ve / veya orijinal eylemi değiştirme dahil her şeyi yapabilir. Ayrıca, düğüm oluşturma ile tamamen ilgisiz bir şey de yapabilir.

Bir geri arama, belirli bir kanca türü olarak düşünülebilir. Bir sisteme geri arama işlevselliği uygulayarak, bu sistem bir eylem tamamlandıktan sonra bazı ek kodları çağırmanıza izin verir. Ancak, kancalama (genel bir terim olarak) geri aramalarla sınırlı değildir.

Başka bir örnek. Bazen Web Geliştiricileri, öğelerin üzerindeki sınıf adlarını ve / veya kimliklerini kanca olarak ifade ederler. Bunun nedeni, bir öğeye kimlik / sınıf adını yerleştirerek, öğeyi değiştirmek için Javascript kullanabilir veya sayfa belgesine "bağlanabilir". (bu anlamı genişletir, ancak yaygın olarak kullanılır ve söz etmeye değer)


"Sayfa belgesine bağlanmak" ile ne demek istiyorsun? Bir örnek verebilir misiniz? Öğeyi değiştirmek için javacript kullanabilirsiniz böylece bir html öğesi bir kimlik vererek ilk örneği anladım.
committedandroider

21

Basit dedi:

Kanca, varolan kodun öncesinde, sonrasında veya yerine özel kod (işlev) yürütmenin bir yoludur. Örneğin, normal giriş işlemine devam etmeden önce bir Captcha işlevini yürütmek için giriş işlemine "bağlanmak" için bir işlev yazılabilir.


En iyi cevap imo
Daniel

15

Programlamada çengelleme , bir olay işleyici olarak bir prosedür zinciri yapmak için kanca denilen bir tekniktir.


15

Kancalar, taban kodunun dahili kod çağırmasını sağlayan bir işlev kategorisidir. Bu, bir çekirdek geliştiricinin kodlarını göstermeden genişletilebilirlik sunmak istediği durumlarda yararlı olabilir.

Kancaların bir kullanımı video oyunu mod geliştirmedir. Bir oyun, mod geliştiricilerinin temel işlevselliği genişletmesine izin vermeyebilir, ancak çekirdek mod kitaplığı geliştiricileri tarafından kancalar eklenebilir. Bu kancalarla, bağımsız geliştiriciler, oyun yükleme, envanter güncellemeleri, varlık etkileşimleri vb.Gibi herhangi bir olay üzerine özel kodlarını çağırabilir.

Yaygın bir uygulama yöntemi, bir işleve boş bir geri arama listesi vermek, ardından geri arama listesini genişletme yeteneğini ortaya koymaktır. Temel kod her zaman aynı ve uygun zamanda işlevi çağıracaktır, ancak boş bir geri arama listesiyle işlev hiçbir şey yapmaz. Bu tasarım gereğidir.

Üçüncü bir taraf, daha sonra, ek kod yazma ve yeni geri aramalarını çağrının çağırma listesine ekleme olanağına sahiptir. Mevcut kancaların referansından başka bir şey olmadan, temel sistem için minimum risk altında genişletilmiş işlevselliğe sahiptirler.

Kancalar, geliştiricilerin diğer yapılarla ve arabirimlerle yapılamayacak bir şey yapmalarına izin vermez. Görev ve kullanıcılar (üçüncü taraf geliştiriciler) dikkate alınarak yapılacak bir seçimdir.

Açıklığa kavuşturmak için: bir kanca uzatmaya izin verir ve geri aramalar kullanılarak uygulanabilir. Geri aramalar genellikle bir işlev işaretçisinden başka bir şey değildir; bir işlevin hesaplanmış adresi. Diğer cevaplarda / yorumlarda karışıklık var gibi görünüyor.


4

Hook, kodda belirli türde bir olay gönderdiğiniz bir yeri belirtir ve bu olay daha önce geri çağırmak için uygun bir işlevle kaydedilmişse, bu kayıtlı işlev tarafından işlenir, aksi takdirde hiçbir şey olmaz.


2

kancalar bazı durumlarla karşılaşıldığında yürütülebilir. örneğin, bazı değişken değişiklikler veya bir eylem çağrılır veya bir olay meydana gelir. kancalar sürece girebilir ve bir şeyleri değiştirebilir veya değişikliklere tepki verebilir.


1

Genellikle çengel Win32 mesaj çengelini veya Linux / OSX eşdeğerlerini ifade eder, ancak daha genel olarak çengelleme, belirli bir eylem gerçekleştiğinde bildirilmesini istediğiniz başka bir nesneyi / pencereyi / programı / vb. Örneğin: Sistemdeki tüm pencerelerin kapanmak üzere olduklarını size bildirmesi.

Genel bir kural olarak, çengelleme biraz tehlikelidir çünkü sistemi nasıl etkilediğini anlamadan yapmak kararsızlığa veya en az beklenmedik davranışa yol açabilir. Ayrıca, bazı durumlarda ÇOK yararlı olabilir, diye düşündü. Örneğin: FRAPS bunu hangi pencerelerin FPS sayacında göstermesi gerektiğini belirlemek için kullanır.


1

Bir kanca zinciri, her bir fonksiyonun bir sonrakini çağırdığı bir dizi işlevdir. Bir kanca zinciri hakkında önemli olan, bir programcının çalışma zamanında zincire başka bir fonksiyon ekleyebilmesidir. Bunu yapmanın bir yolu, bir zincirdeki ilk işlevin adresinin tutulduğu bilinen bir konum aramaktır. Daha sonra, o fonksiyon işaretçisinin değerini kaydeder ve kanca zincirine eklemek istediğiniz fonksiyonun adresiyle başlangıç ​​adresindeki değerin üzerine yazarsınız. Fonksiyon daha sonra çağrılır, işini yapar ve zincirdeki bir sonraki fonksiyonu çağırır (aksi kararlaştırmadıkça). Doğal olarak, doğrudan hafızadan belleğe Ruby veya Python gibi dillerin meta programlama olanaklarını kullanmaya kadar bir kanca zinciri oluşturmanın başka yolları da vardır.

Kanca zincirine bir örnek, MS Windows uygulamasının iletileri işleme biçimidir. İşleme zincirindeki her işlev bir iletiyi işler veya zincirdeki bir sonraki işleve gönderir.


1

Drupal içerik yönetim sisteminde 'kanca' nispeten spesifik bir anlama sahiptir. Dahili bir olay meydana geldiğinde (örneğin içerik oluşturma veya kullanıcı girişi gibi), modüller özel bir "kanca" işlevi uygulayarak olaya yanıt verebilir. Bu, örneğin Kullanıcı Girişi etkinliği için [- eklenti-adınız] _user_login () adlandırma kuralı ile yapılır.

Bu kural nedeniyle, temeldeki olaylara "kanca" denir ve Drupal'ın API belgelerinde "hook_user_login" ve "hook_user_authenticate ()" gibi adlarla görünür.


Bu, yukarıda belirtilen , bir şey olduğunda tepki vermek için "geri arama" " fikrini izler . Bu durumda, geri arama açıkça kaydedilmez, ancak "sihirli adlandırma" ya dayanır. Bu şu anda drupal.org'da tartışılmıştır, bkz . Olay kancaları için Symfony EventDispatcher'ı kullanma
donquixote

Genellemek için, bir kanca / geri arama / dinleyici farklı yollarla "arama kodu tarafından bilinir" (bunun tamamlandığını söylemez): 1. sihirli adlı fonksiyonlar 2. sihirli adlı sınıflar 3. açıkça kayıtlı fonksiyonlar 4. açıkça kayıtlı nesneler (dinleyiciler, aboneler, gözlemciler) 5. kanca ateşlemeden önce somutlaştırılacak açıkça kaydedilmiş sınıf isimleri (+ isteğe bağlı kurucu argümanları). 6. telefon kodunu değiştirerek
donquixote

1

ÇOK kısacası, bir API çağrısının kodunu, sizin MessageBoxdüzenlediğiniz farklı bir işlevi nerede yaptığı gibi değiştirebilirsiniz (global olarak sistem çapında çalışacak, yerel olarak işlem boyunca çalışacaktır).

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.