Сигналдар мен слоттар: Объектілер арасындағы байланыс механизмі
Signals and slots
Qt-дағы сигналдар мен слоттар – объектілер арасындағы байланыс құрылымы. Observer үлгісін жеңілдетеді, типтік қателерден сақтайды, GUI және асинхронды I/O үшін пайдалы.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Сигналдар мен слоттар – Qt-де объектілер арасындағы байланыс үшін енгізілген тіл құрылымы, ол бақылаушы үлгісін жүзеге асыруды жеңілдетеді және артық кодтан сақтауға көмектеседі. Бұл тұжырымдама бойынша GUI виджеттері және басқа да объектілер оқиға туралы ақпаратты қамтитын сигналдарды жібере алады, ал оларды басқа объектілер слоттар деп аталатын арнайы мүше функцияларын пайдаланып қабылдайды. Бұл C/C++ функциялық көрсеткіштеріне ұқсас, бірақ сигналдар/слоттар жүйесі кері шақыру аргументтерінің түрінің дұрыстығын қамтамасыз етеді. Сигналдар/слоттар жүйесі графикалық пайдаланушы интерфейстерін жобалау тәсілімен үйлеседі. Сонымен қатар, сигналдар/слоттар жүйесі басқа да GUI емес қолданыстар үшін де пайдаланылуы мүмкін, мысалы, асинхронды I/O (сокеттер, құбырлар, тізбекті құрылғылар және т.б. кіретін), оқиға туралы хабарлау немесе белгілі бір уақыт өткен кезде орындалатын шараларды тиісті объектілердің мысалдарымен және әдістерімен немесе функцияларымен байланыстыру үшін. Оны пайдалану оңай, себебі тіркеу/тіркеуден шығару/шақыру кодын жазу қажет емес, өйткені Qt метаобъект компиляторы (MOC) қажетті инфрақұрылымды автоматты түрде жасайды. Электрондық кесте бағдарламаларының жаңарту жүйесі сигналдар мен слоттарды пайдаланып іске асырылуы мүмкін, яғни бір ұяшық өзгерген кезде оған тәуелді ұяшықтар хабарланады/жаңартылады.
Signals and slots is a language construct introduced in Qt for communication between objects which makes it easy to implement the observer pattern while avoiding boilerplate code. The concept is that GUI widgets, and other objects, can send signals containing event information which can be received by other objects using special member functions known as slots. This is similar to C/C++ function pointers, but the signal/slot system ensures the type correctness of callback arguments. The signal/slot system fits well with the way graphical user interfaces are designed. Similarly, the signal/slot system can be used for other non GUI usages, for example asynchronous I/O (including sockets, pipes, serial devices, etc.) event notification or to associate timeout events with appropriate object instances and methods or functions. It is easy to use and no registration/deregistration/invocation code need to be written, because Qt's metaobject compiler (MOC) automatically generates the needed infrastructure. A spreadsheet programs update system could be implemented using signals and slots such that when a cell is changed, its dependent cells are notified/updated.
Баламалы іске асырулар
C++ үлгілеріне негізделген сигнал/слот жүйелерінің бірнеше іске асырылуы бар, олар Qt қолданғандай қосымша метаобъект компиляторын қажет етпейді, мысалы libsigc++, sigslot, vdk сигналдары, нано сигналды слот, neosigslot, Signals, boost.signals2, Synapse, Cpp::Events, Platinum, JBroadcaster және KDBindings. C# сияқты Ортақ Тілдік Инфрақұрылым (CLI) тілдері де ұқсас құрылымды қолдайды, бірақ басқа терминологиямен және синтаксиспен: оқиғалар сигналдардың орнында, ал делегаттар слоттардың орнында тұрады. ActionScript 3.0 үшін де сигналдардың бір іске асырылуы бар, ол C# оқиғаларынан және Qt-тағы сигналдар/слоттардан шабыттанды. Бұдан өзге, делегат функция көрсеткіші сияқты жергілікті айнымалы бола алады, ал Qt-дағы слот міндетті түрде осылай жарияланған сынып мүшесі болуы керек. C-негізделген GObject жүйесі де GSignal арқылы ұқсас мүмкіндіктерді ұсынады. D тілінде бұл std.signals арқылы іске асырылады.
There are some implementations of signal/slot systems based on C++ templates, which don't require the extra metaobject compiler, as used by Qt, such as libsigc++, sigslot, vdk signals, nano signal slot, neosigslot, Signals, boost. signals2, Synapse, Cpp::Events, Platinum, JBroadcaster and KDBindings. Common Language Infrastructure (CLI) languages such as C# also supports a similar construct although with a different terminology and syntax: events play the role of signals, and delegates are the slots. Another implementation of signals exists for ActionScript 3.0, inspired by C# events and signals/slots in Qt. Additionally, a delegate can be a local variable, much like a function pointer, while a slot in Qt must be a class member declared as such. The C based GObject system also provides similar functionality via GSignal. In D it is implemented by std. signals.
Кітапханалар
Java: sig4j көп жіпті, типтік қауіпсіздікке ие, Java 8-де ұсынылған FunctionalInterface аннотациясына негізделген. C++: vdk сигналдары жіптік қауіпсіздікке ие, типтік қауіпсіздікке ие, C++11-де атомдық айнымалыларды қолданып жазылған.
Java: sig4j multi threaded, type safe, based on the FunctionalInterface annotation introduced in Java 8. C++: vdk signals thread safe, type safe, written in C++11 with atomic variables.