Php 依赖注入w/JavaScript |有用还是无用?
我在PHP中使用依赖注入(标记为b.c.用作比较),因为这似乎是最佳实践。PHP有更多面向对象编程的结构,但在JavaScript中使用DI以及代码去耦合似乎是可行的 在我的例子中,b.c.有点复杂。我的对象包含对象属性(函数对象),每个属性都有自己的依赖项 下面是有问题的代码,它有3个依赖项,我在顶层对象中创建了这些依赖项,但我正在考虑注入 当它们在单个对象MC.MATweet中的不同函数对象中使用时,我将在何处注入它们 这三个对象是SText、SMessage和SUniversalsPhp 依赖注入w/JavaScript |有用还是无用?,php,javascript,dependency-injection,Php,Javascript,Dependency Injection,我在PHP中使用依赖注入(标记为b.c.用作比较),因为这似乎是最佳实践。PHP有更多面向对象编程的结构,但在JavaScript中使用DI以及代码去耦合似乎是可行的 在我的例子中,b.c.有点复杂。我的对象包含对象属性(函数对象),每个属性都有自己的依赖项 下面是有问题的代码,它有3个依赖项,我在顶层对象中创建了这些依赖项,但我正在考虑注入 当它们在单个对象MC.MATweet中的不同函数对象中使用时,我将在何处注入它们 这三个对象是SText、SMessage和SUniversals /**
/**
** MATweet - Text, Universal, Message - Inject?
*/
MC.MATweet = {
init: function() {
var tweet_button = document.getElementById( 'po_but' ),
tweet_input = document.getElementById( 'po_in' );
tweet_button.addEventListener( "click", function() {
MC.Controller( MC.o_p( 'MATweet' ) );
}, false );
tweet_input.addEventListener( "keypress", function( event ) {
if( event.keyCode === 13 ) {
MC.Controller( MC.o_p( 'MATweet' ) );
event.preventDefault();
}
}, false );
sStyle( [ "po_in","po_lab" ] );
},
pre : function( o_p ) {
var form_elements = document.getElementById( 'fo_po' ).elements,
text_object = new SText( form_elements ),
universal_object = new SUniversals();
if( universal_object.get('load') === '1' )
{
if( !text_object.checkEmpty() ) {
return MC.MATweet.message( 'empty', o_p );
}
if( !text_object.checkPattern( 'tweet' ) ) {
return MC.MATweet.message( 'tweet', o_p );
}
}
o_p.args.hash = localStorage.hash;
o_p.page = text_object.getArray();
return o_p;
},
post : function( o_p ) {
if( o_p.server.result === 'true' ) {
MC.C.resetView( 'po_in' );
vTPane( o_p.server.tweets );
}
},
message: function( type, o_p )
{
var response_element = document.getElementById( 'i_box_rr' ),
pane_element = document.getElementById( 'i_box_r_post' ),
message_object = new SMessage( response_element ),
cover_element = document.getElementById( 'po_but_cov' );
o_p.result = 'complete';
message_object.display( type );
cover_element.style.display = 'inline';
MC.MATweet.movePane( pane_element, 30, 'down' );
return o_p;
},
movePane: function( pane_element, pos, dir ) {
if( ( dir === 'down' ) && ( pos < 70 ) ) {
pos += 1;
pane_element.style.top = ( pos ) + 'px';
setTimeout( function( ){ MC.MATweet.movePane( pane_element, pos, dir ); }, 1 );
}
else if( ( dir === 'down' ) && pos === 70 ) {
dir = 'up';
setTimeout( function( ){ MC.MATweet.movePane( pane_element, pos, dir ); }, 2000 );
}
else if( ( dir === 'up' ) && ( pos > 30 ) ) {
pos -= 1;
pane_element.style.top = ( pos ) + 'px';
setTimeout( function( ){ MC.MATweet.movePane( pane_element, pos, dir ); }, 1 );
}
else if( ( dir === 'up' ) && ( pos === 30 ) ) {
document.getElementById( 'po_but_cov' ).style.display='none';
}
},
};
/**
**MATweet-文本、通用、消息-注入?
*/
MC.MATweet={
init:function(){
var tweet_button=document.getElementById('po_but'),
tweet_input=document.getElementById('po_in');
tweet_按钮。addEventListener(“单击”,函数(){
管制员(MC.o_p""MATweet");;
},假);
tweet_input.addEventListener(“按键”,函数(事件){
如果(event.keyCode===13){
管制员(MC.o_p""MATweet");;
event.preventDefault();
}
},假);
sStyle([“po_in”,“po_lab”]);
},
前置:功能(o_p){
var form_elements=document.getElementById('fo_po')。元素,
text_object=新的SText(form_元素),
universal_object=新的suniversalsals();
if(universal_object.get('load')='1')
{
如果(!text_object.checkEmpty()){
返回MC.MATweet.message('empty',o_p);
}
如果(!text_object.checkPattern('tweet')){
返回MC.MATweet.message('tweet',o_p);
}
}
o_p.args.hash=localStorage.hash;
o_p.page=text_object.getArray();
返回o_p;
},
职位:职能(o_p){
如果(o_p.server.result=='true'){
MC.C.resetView('po_in');
vTPane(o_p.server.tweets);
}
},
信息:功能(类型,o_p)
{
var response\u element=document.getElementById('i\u box\u rr'),
pane\u element=document.getElementById('i\u box\r\u post'),
消息对象=新的SMessage(响应元素),
cover_element=document.getElementById('po_but_cov');
o_p.result='完成';
消息对象显示(类型);
cover_element.style.display='inline';
MC.MATweet.movePane(窗格元素,30,“向下”);
返回o_p;
},
移动窗格:功能(窗格元素、位置、方向){
如果((dir=='down')&&(位置<70)){
pos+=1;
pane_element.style.top=(pos)+“px”;
setTimeout(函数(){MC.MATweet.movePane(pane_元素,pos,dir);},1);
}
如果((dir=='down')&&pos==70){
dir='up';
setTimeout(函数(){MC.MATweet.movePane(pane_元素,pos,dir);},2000);
}
如果((dir==='up')&&(pos>30)){
pos-=1;
pane_element.style.top=(pos)+“px”;
setTimeout(函数(){MC.MATweet.movePane(pane_元素,pos,dir);},1);
}
如果((dir=='up')&&(pos==30)){
document.getElementById('po_but_cov').style.display='none';
}
},
};
您是对的,示例代码很脆弱,依赖于系统的许多其他部分
但是,通过添加依赖项注入,这个类不会变得更简单——它只会更难阅读和修改。问题不是它命名了它调用的外部特性,而是它首先调用了太多的外部代码
现在,这段代码处理用户输入tweet、发送到服务器的tweet以及显示的tweet的所有编码和交互。难怪它是个毛球。将它们分成单独的类,每个类只负责一件事,并通过事件而不是通过调用彼此进行通信
所以,您的tweet输入视图类将只负责发送包含单个tweet文本字符串的“new_tweet”消息
您的tweet显示窗格类侦听tweet列表的更改并重新绘制自身
创建tweet输入视图的控制器代码还将“new_tweet”事件的侦听器附加到该视图,然后将这些新tweet发送到服务器
通过这种方式,您的代码将最小程度地交织在一起,从而实现理解、重用和美观。您是正确的,示例代码很脆弱,并且依赖于系统的许多其他部分 但是,通过添加依赖项注入,这个类不会变得更简单——它只会更难阅读和修改。问题不是它命名了它调用的外部特性,而是它首先调用了太多的外部代码 现在,这段代码处理用户输入tweet、发送到服务器的tweet以及显示的tweet的所有编码和交互。难怪它是个毛球。将它们分成单独的类,每个类只负责一件事,并通过事件而不是通过调用彼此进行通信 所以,您的tweet输入视图类将只负责发送包含单个tweet文本字符串的“new_tweet”消息 您的tweet显示窗格类侦听tweet列表的更改并重新绘制自身 创建tweet输入视图的控制器代码还将“new_tweet”事件的侦听器附加到该视图,然后将这些新tweet发送到服务器 这样你的鳕鱼