पर्ल को शायद ही कभी IoC, DI और मैजिक पिल Kaiten :: कंटेनर का इस्तेमाल किया गया हो

मुझे लगता है कि बहुत से लोग नियंत्रण के उलट (आईओसी) और निर्भरता इंजेक्शन (डीआई) चर्चा के महत्व को समझते हैं। यदि यह बहुत नहीं है, लेकिन दिलचस्प है - हैबे पर इस विषय पर कई लेख थे, यह बहुत जानकारीपूर्ण और सुलभ था।
तकनीकें उत्कृष्ट हैं, लेकिन किसी तरह उन्हें वास्तविक जीवन में लागू नहीं किया जा सकता है।

Cutscene के तहत - पर्ल में मामलों की एक छोटी सी अवलोकन और एक स्वतंत्र "समाधान" लगता है।

तो, यह वास्तविक कोड में कुछ लागू करने के लिए क्यों नहीं निकला।
वास्तव में, सब कुछ काफी समझ में आता है - डीआई कार्यान्वयन की घोषणा करने वाले उपलब्ध मॉड्यूल समझना मुश्किल है और काल्पनिक रूप से उपयोग करना मुश्किल है, और कोड कम और अधिक है। और बहुत अजीब है।
$c->add_service( Bread::Board::BlockInjection->new( name => 'authenticator', block => sub { my $service = shift; Authenticator->new( db_conn => $service->param('db_conn'), logger => $service->param('logger') ); }, dependencies => { db_conn => Bread::Board::Dependency->new( service_path => 'db_conn' ), logger => Bread::Board::Dependency->new( service_path => 'logger' ), } ) ); 

ब्रेड से एक उदाहरण :: बोर्ड मैनुअल, जो (मैनुअल) 4 पृष्ठों में फैला हुआ है!

 $c = IOC::Slinky::Container->new( config => { container => { # constructor injection dbh => { _class => "DBI", _constructor => "connect", _constructor_args => [ "DBD:SQLite:dbname=/tmp/my.db", "user", "pass", { RaiseError => 1 }, ], }, # setter injection y2k => { _singleton => 0, _class => "DateTime", year => 2000, month => 1, day => 1, }, } } ); 

उदाहरण IOC :: स्लिंकी :: कंटेनर, पहले से बेहतर, लेकिन फिर भी वही टिन, यदि आप इसके बारे में सोचते हैं।

 my $c = Peco::Container->new; $c->register('log_mode', O_APPEND); $c->register('log_file', '/var/log/my-app.log'); $c->register('log_fh', 'IO::File', ['log_file', 'log_mode']); $c->register('my_logger', 'My::Logger', ['log_fh']); 

उदाहरण Peco :: कंटेनर - "नियंत्रण का हल्का उलटा (IoC) कंटेनर" के रूप में देखा गया। अंतिम पंक्ति लेने की कोशिश करें और रिवर्स ऑर्डर में जो हो रहा है उसका पालन करें। फिर भी समझते हैं कि क्या चल रहा है?

IMHO पूरी समस्या यह है कि ये कार्यान्वयन जटिल हैं, कुछ सुविधाओं के साथ अतिभारित हैं और परिणामस्वरूप अदृश्य, उपयोग करने में असुविधाजनक हैं और नरक में समर्थन को बदल सकते हैं।

DIc से सभी की आवश्यकता होती है जो कोड का एक टुकड़ा वहां रखने की क्षमता रखता है और बाद में इसके निष्पादन का परिणाम प्राप्त करता है। हमने dbh को खाली रखा - हमें आउटपुट पर एक काम करने वाला हैंडलर मिला। कोई जादू नहीं, कॉन्फ़िगरेशन फ़ाइल और अन्य शैक्षणिक सामग्री से कोड बनाना।

 my $kaiten_config = { examplep_config => { handler => sub { { RaiseError => 1 } }, probe => sub { 1 }, settings => { reusable => 1 }, }, ExampleP => { handler => sub { my $c = shift; my $conf = $c->get_by_name('examplep_config'); return DBI->connect( "dbi:ExampleP:", "", "", $conf ) or die $DBI::errstr; }, probe => sub { shift->ping() }, settings => { reusable => 1 } } }; my $container = Kaiten::Container->new( init => $kaiten_config ); my $dbh = $container->get_by_name('ExampleP'); 

Kaiten :: कंटेनर उदाहरण सरल, स्पष्ट और कुशल है।

किट में उदाहरण और दस्तावेज, आप CPAN और github पर ले सकते हैं।

घृणा के प्रश्न, धन्यवाद, शाप और किरणें यहां प्रकाशित की जा सकती हैं या आपके लिए सुविधाजनक हैं।

पुनश्च। यदि मॉड्यूल स्थापित नहीं करना चाहता है, तो कुछ की रिपोर्टिंग करना

 # Failed test 'use Kaiten::Container;' # at t/00-load.t line 6. # Tried to use 'Kaiten::Container'. # Error: Argument "1.12_03" isn't numeric in numeric gt (>)... 

यहाँ लालसा मू पैच में शामिल हों।

पी पी एस। और अब 3 डी में! निर्भरता संकल्प समर्थित है।

Source: https://habr.com/ru/post/In134891/


All Articles