Inversion of control
સોફ્ટવેર એન્જિનિયરિંગમાં, ઇન્વર્ઝન ઓફ કંટ્રોલ (આઇઓસી) એ એક ડિઝાઇન પેટર્ન છે જેમાં કમ્પ્યુટર પ્રોગ્રામના કસ્ટમ-લેખિત ભાગો સામાન્ય માળખામાંથી નિયંત્રણનો પ્રવાહ પ્રાપ્ત કરે છે. "ઇન્વર્ઝન" શબ્દ ઐતિહાસિક છેઃ પ્રક્રિયાગત પ્રોગ્રામિંગની સરખામણીમાં આ ડિઝાઇન "ઇન્વર્ટ્સ" નિયંત્રણ સાથેનું સોફ્ટવેર આર્કિટેક્ચર. પ્રક્રિયાગત પ્રોગ્રામિંગમાં, પ્રોગ્રામનો કસ્ટમ કોડ સામાન્ય કાર્યોની સંભાળ રાખવા માટે ફરીથી વાપરી શકાય તેવી લાઈબ્રેરીઓને કૉલ કરે છે, પરંતુ નિયંત્રણના વ્યુત્ક્રમ સાથે, તે માળખું છે જે કસ્ટમ કોડને કૉલ કરે છે. નિયંત્રણના વ્યુત્ક્રમનો ઉપયોગ GUI વાતાવરણના ઉદયથી એપ્લિકેશન વિકાસ માળખા દ્વારા વ્યાપકપણે કરવામાં આવે છે અને GUI વાતાવરણમાં અને વેબ સર્વર એપ્લિકેશન માળખા બંનેમાં તેનો ઉપયોગ ચાલુ છે. નિયંત્રણનું વ્યુત્ક્રમ એપ્લિકેશન પ્રોગ્રામર દ્વારા વ્યાખ્યાયિત પદ્ધતિઓ દ્વારા માળખાને વિસ્તૃત બનાવે છે. ઇવેન્ટ-સંચાલિત પ્રોગ્રામિંગ ઘણીવાર આઇઓસીનો ઉપયોગ કરીને અમલમાં મૂકવામાં આવે છે જેથી કસ્ટમ કોડને ફક્ત ઇવેન્ટ્સના સંચાલન સાથે સંબંધિત હોવું જરૂરી છે, જ્યારે ઇવેન્ટ લૂપ અને ઇવેન્ટ્સ/સંદેશાઓનું પ્રેષણ માળખું અથવા રનટાઇમ વાતાવરણ દ્વારા નિયંત્રિત થાય છે. વેબ સર્વર એપ્લિકેશન માળખામાં, રવાનગીને સામાન્ય રીતે રાઉટીંગ કહેવામાં આવે છે, અને હેન્ડલર્સને અંતિમ બિંદુઓ કહી શકાય છે. "ઇન્વર્ઝન ઓફ કંટ્રોલ" શબ્દસમૂહનો ઉપયોગ જાવા પ્રોગ્રામરોના સમુદાયમાં પણ અલગથી થવા લાગ્યો છે, જે ખાસ કરીને સ્પ્રિંગ ફ્રેમવર્ક જેવા જાવા માળખામાં "આઇઓસી કન્ટેનર" સાથે થતી વસ્તુઓની અવલંબનને ઇન્જેક્શન આપવાની પેટર્નનો સંદર્ભ આપે છે. આ અલગ અર્થમાં, "નિયંત્રણનું વ્યુત્ક્રમ" એ ફ્રેમવર્ક નિયંત્રણ પ્રવાહ (એપ્લિકેશન કોડના અમલના સમય પર નિયંત્રણ) આપવાના મૂળ અર્થને બદલે એપ્લિકેશન ઓબ્જેક્ટો દ્વારા ઉપયોગમાં લેવાતા અવલંબનના અમલીકરણ પર ફ્રેમવર્ક નિયંત્રણ આપવાનો સંદર્ભ આપે છે. કૉલબૅક). ઝાંખી ઉદાહરણ તરીકે, પરંપરાગત પ્રોગ્રામિંગ સાથે, એપ્લિકેશનનું મુખ્ય કાર્ય ઉપલબ્ધ આદેશોની સૂચિ પ્રદર્શિત કરવા અને વપરાશકર્તાને એક પસંદ કરવા માટે ક્વેરી કરવા માટે મેનૂ લાઇબ્રેરીમાં કાર્ય કૉલ કરી શકે છે. લાઇબ્રેરી આમ ફંક્શન કૉલના મૂલ્ય તરીકે પસંદ કરેલા વિકલ્પને પરત કરશે, અને મુખ્ય કાર્ય સંકળાયેલ આદેશને ચલાવવા માટે આ મૂલ્યનો ઉપયોગ કરે છે. આ શૈલી લખાણ આધારિત ઇન્ટરફેસમાં સામાન્ય હતી. ઉદાહરણ તરીકે, ઇમેઇલ ક્લાયન્ટ નવો મેઇલ લોડ કરવા, વર્તમાન મેઇલનો જવાબ આપવા, નવો મેઇલ બનાવવા વગેરે આદેશો સાથે સ્ક્રીન બતાવી શકે છે અને જ્યાં સુધી વપરાશકર્તા આદેશ પસંદ કરવા માટે કી દબાવતો નથી ત્યાં સુધી પ્રોગ્રામ એક્ઝેક્યુશન અવરોધિત કરશે. નિયંત્રણના વ્યુત્ક્રમ સાથે, બીજી બાજુ, પ્રોગ્રામને સોફ્ટવેર માળખાનો ઉપયોગ કરીને લખવામાં આવશે જે સામાન્ય વર્તણૂકીય અને ગ્રાફિકલ તત્વોને જાણે છે, જેમ કે વિન્ડોઇંગ સિસ્ટમ્સ, મેનુઓ, માઉસને નિયંત્રિત કરવા વગેરે. કસ્ટમ કોડ માળખા માટે "ખાલી જગ્યાઓ ભરે છે", જેમ કે મેનુ વસ્તુઓનું કોષ્ટક પૂરું પાડવું અને દરેક વસ્તુ માટે કોડ સબરૂટિનની નોંધણી કરવી, પરંતુ તે માળખું છે જે વપરાશકર્તાની ક્રિયાઓનું નિરીક્ષણ કરે છે અને જ્યારે મેનુ વસ્તુ પસંદ કરવામાં આવે ત્યારે સબરૂટિનને બોલાવે છે. મેઇલ ક્લાયન્ટના ઉદાહરણમાં, માળખું કીબોર્ડ અને માઉસ ઇનપુટ્સ બંનેને અનુસરી શકે છે અને વપરાશકર્તા દ્વારા બોલાવવામાં આવેલા આદેશને કોઈપણ રીતે કૉલ કરી શકે છે, અને તે જ સમયે નવા સંદેશાઓ આવે છે કે કેમ તે શોધવા માટે નેટવર્ક ઇન્ટરફેસનું નિરીક્ષણ કરી શકે છે અને જ્યારે કોઈ નેટવર્ક પ્રવૃત્તિ શોધાય ત્યારે સ્ક્રીનને રીફ્રેશ કરી શકે છે. સમાન માળખાનો ઉપયોગ સ્પ્રેડશીટ પ્રોગ્રામ અથવા ટેક્સ્ટ એડિટર માટે હાડપિંજર તરીકે થઈ શકે છે. તેનાથી વિપરીત, માળખું વેબ બ્રાઉઝર્સ, સ્પ્રેડશીટ્સ અથવા ટેક્સ્ટ સંપાદકો વિશે કંઇ જાણતું નથી; તેમની કાર્યક્ષમતાને અમલમાં મૂકવા માટે કસ્ટમ કોડ લે છે. નિયંત્રણનું વ્યુત્ક્રમ એ મજબૂત અર્થ ધરાવે છે કે ફરીથી વાપરી શકાય તેવો કોડ અને સમસ્યા-વિશિષ્ટ કોડ સ્વતંત્ર રીતે વિકસાવવામાં આવે છે, તેમ છતાં તેઓ એપ્લિકેશનમાં એકસાથે કાર્ય કરે છે. કોલબેક્સ, શેડ્યૂલર, ઇવેન્ટ લૂપ્સ અને ટેમ્પ્લેટ પદ્ધતિ એ ડિઝાઇન પેટર્નના ઉદાહરણો છે જે નિયંત્રણ સિદ્ધાંતના વ્યુત્ક્રમને અનુસરે છે, જો કે આ શબ્દનો ઉપયોગ સામાન્ય રીતે ઓબ્જેક્ટ-ઓરિએન્ટેડ પ્રોગ્રામિંગના સંદર્ભમાં થાય છે. (ડિપેન્ડન્સી ઈન્જેક્શન એ જાવા માળખા દ્વારા લોકપ્રિય "ડિપેન્ડન્સીના અમલીકરણ પર ઉલટું નિયંત્રણ" ના અલગ, ચોક્કસ વિચારનું ઉદાહરણ છે.) નિયંત્રણના વ્યુત્ક્રમને કેટલીકવાર "હોલીવુડ સિદ્ધાંતઃ અમને કૉલ કરશો નહીં, અમે તમને કૉલ કરીશું" તરીકે ઓળખવામાં આવે છે. કોમ્પ્યુટર વિજ્ઞાનમાં બેકગ્રાઉન્ડ ઇન્વર્ઝન ઓફ કંટ્રોલ એ નવો શબ્દ નથી. માર્ટિન ફોલ્લર આ શબ્દસમૂહની વ્યુત્પત્તિ 1988 માં શોધી કાઢે છે, પરંતુ તે માઇકલ જેક્સન દ્વારા 1970 ના દાયકામાં તેમની જેક્સન સ્ટ્રક્ચર્ડ પ્રોગ્રામિંગ પદ્ધતિમાં વર્ણવેલ પ્રોગ્રામ ઇન્વર્ઝનની વિભાવના સાથે નજીકથી સંબંધિત છે. બોટમ-અપ પાર્સરને ટોપ-ડાઉન પાર્સરના વ્યુત્ક્રમ તરીકે જોઈ શકાય છેઃ એક કિસ્સામાં, નિયંત્રણ પાર્સર પાસે હોય છે, જ્યારે અન્ય કિસ્સામાં, તે પ્રાપ્ત એપ્લિકેશન સાથે હોય છે. આ શબ્દનો ઉપયોગ માઈકલ મેટસન દ્વારા એક થીસીસમાં કરવામાં આવ્યો હતો (તેના મૂળ અર્થમાં ફ્રેમવર્ક કોલિંગ એપ્લિકેશન કોડને બદલે તેનાથી ઊલટું), અને તે પછી સ્ટેફાનો મેઝોચી દ્વારા ત્યાંથી લેવામાં આવ્યો હતો અને 1999 માં નિષ્ક્રિય અપાચે સોફ્ટવેર ફાઉન્ડેશન પ્રોજેક્ટ, એવલોનમાં તેમના દ્વારા લોકપ્રિય બનાવવામાં આવ્યો હતો, જેમાં તે અમલના પ્રવાહને નિયંત્રિત કરવા ઉપરાંત બાળ ઑબ્જેક્ટની નિર્ભરતામાં પસાર થતા પિતૃ પદાર્થનો ઉલ્લેખ કરે છે. આ શબ્દસમૂહને 2004માં રોબર્ટ સી. માર્ટિન અને માર્ટિન ફોલ્લર દ્વારા વધુ લોકપ્રિય બનાવવામાં આવ્યો હતો, જેમાંથી બાદમાં આ શબ્દની ઉત્પત્તિ 1980ના દાયકામાં થઈ હોવાનું જાણવા મળે છે. વર્ણન પરંપરાગત પ્રોગ્રામિંગમાં, વ્યવસાયિક તર્કનો પ્રવાહ એવા પદાર્થો દ્વારા નક્કી થાય છે જે એકબીજા સાથે સ્થિર રીતે બંધાયેલા હોય છે. નિયંત્રણના વ્યુત્ક્રમ સાથે, પ્રવાહ ઑબ્જેક્ટ ગ્રાફ પર આધાર રાખે છે જે પ્રોગ્રામ એક્ઝેક્યુશન દરમિયાન બનાવવામાં આવે છે. આવા ગતિશીલ પ્રવાહ ઑબ્જેક્ટ ક્રિયાપ્રતિક્રિયાઓ દ્વારા શક્ય બને છે જે અમૂર્ત દ્વારા વ્યાખ્યાયિત કરવામાં આવે છે. આ રન-ટાઇમ બંધન નિર્ભરતા ઈન્જેક્શન અથવા સર્વિસ લોકેટર જેવી પદ્ધતિઓ દ્વારા પ્રાપ્ત થાય છે. આઇઓસીમાં, સંકલન દરમિયાન કોડને સ્થિર રીતે પણ જોડી શકાય છે, પરંતુ કોડમાં સીધા સંદર્ભને બદલે બાહ્ય રૂપરેખાંકનમાંથી તેનું વર્ણન વાંચીને ચલાવવા માટે કોડ શોધી શકાય છે. ડિપેન્ડન્સી ઈન્જેક્શનમાં, આશ્રિત ઓબ્જેક્ટ અથવા મોડ્યુલને રન ટાઇમ પર જરૂરી ઓબ્જેક્ટ સાથે જોડવામાં આવે છે. પ્રોગ્રામના અમલ દરમિયાન કઈ ચોક્કસ વસ્તુ નિર્ભરતાને સંતોષશે તે સામાન્ય રીતે સ્થિર વિશ્લેષણનો ઉપયોગ કરીને સંકલન સમયે જાણી શકાતું નથી. જ્યારે અહીં ઓબ્જેક્ટ ક્રિયાપ્રતિક્રિયાના સંદર્ભમાં વર્ણવવામાં આવ્યું છે, ત્યારે સિદ્ધાંત ઓબ્જેક્ટ-ઓરિએન્ટેડ પ્રોગ્રામિંગ ઉપરાંત અન્ય પ્રોગ્રામિંગ પધ્ધતિઓ પર લાગુ થઈ શકે છે. ચાલી રહેલા પ્રોગ્રામને ઓબ્જેક્ટોને એકબીજા સાથે બાંધવા માટે, ઓબ્જેક્ટો સુસંગત ઇન્ટરફેસો ધરાવતા હોવા જોઈએ. ઉદાહરણ તરીકે, વર્ગ A ઇન્ટરફેસ I ને વર્તન સોંપી શકે છે જે વર્ગ B દ્વારા અમલમાં મૂકવામાં આવે છે; પ્રોગ્રામ A અને B ને ત્વરિત કરે છે, અને પછી B ને A માં દાખલ કરે છે. XDE, 1985 વિઝ્યુઅલ બેઝિક (ક્લાસિક), 1991 માટે મેસા પ્રોગ્રામિંગ વાતાવરણનો ઉપયોગ કરો. એચ. ટી. એમ. એલ. ડી. ઓ. એમ. ઇવેન્ટ સ્પ્રિંગ ફ્રેમવર્ક <આઇ. ડી. 1> કોર ટેમ્પલેટ પદ્ધતિ પેટર્ન ઉદાહરણ કોડ એચ. ટી. એમ. એલ. ડી. ઓ. એમ. ઇવેન્ટ્સ વેબ બ્રાઉઝર્સ એચ. ટી. એમ. એલ. માં ડી. ઓ. એમ. ઇવેન્ટ્સ માટે ઇન્વર્ઝન ઓફ કંટ્રોલનો અમલ કરે છે. એપ્લિકેશન વિકાસકર્તા કૉલબૅકની નોંધણી કરવા માટે ઉપયોગ કરે છે. <! ડૉક્ટાઇપ એચ. ટી. એમ. એલ.> <એચ. ટી. એમ. એલ. લેંગ = "એન"> <હેડ> <મેટા ચારસેટ = "યુ. ટી. એફ-8"> <શીર્ષક> ડી. ઓ. એમ. સ્તર 2 </શીર્ષક> <હેડ> <બોડી> <એચ1> ડી. ઓ. એમ. સ્તર 2 ઇવેન્ટ હેન્ડલર </એચ1> <પી> <સ્પાન આઈ. ડી. = "આઉટપુટ"> </સ્પાન> </લાર્જ> </પી> <સ્ક્રિપ્ટ> વેર રજિસ્ટર્ડ લિસ્ટનર = ફંક્શન () {document.getElementById ("આઉટપુટ"). ઇનનર એચ. ટી. એમ. એલ. = "<લાર્જ> નોંધાયેલા સાંભળનારને બોલાવવામાં આવ્યો હતો. જો તમે પૃષ્ઠને ક્લિક કરો છો, તો તમારું વેબ બ્રાઉઝર ઇવેન્ટ હેન્ડલરને કૉલ કરશે. </લાર્જ> "</સ્ક્રિપ્ટ> </બોડી> </એચટીએમએલ> વેબ એપ્લિકેશન માળખું Asp.NetCore વેબ એપ્લિકેશન માટેનો આ ઉદાહરણ કોડ વેબ એપ્લિકેશન હોસ્ટ બનાવે છે, અંતિમ બિંદુની નોંધણી કરે છે, અને પછી માળખામાં નિયંત્રણ પસાર કરે છેઃ વાર બિલ્ડર = WebApplication.CreateBuilder (આરજીએસ); વાર એપ્લિકેશન = builder.Build (); app.MapGet (", ") =>" હેલો વર્લ્ડ! "); app.Run (); એબ્સ્ટ્રેક્શન લેયર આર્કેટાઇપ પેટર્ન એસિન્ક્રોનસ I/O એસ્પેક્ટ-ઓરિએન્ટેડ પ્રોગ્રામિંગ કોલબેક (કોમ્પ્યુટર સાયન્સ) ક્લોઝર (કોમ્પ્યુટર સાયન્સ) કન્ટિન્યુએશન ડેલિગેટ (CLI) ડિપેન્ડન્સી ઇન્વર્ઝન પ્રિન્સિપલ ફ્લો-બેઝ્ડ પ્રોગ્રામિંગ ઇમ્પ્લિસિટ ઇન્વોકેશન ઇન્ટરપ્ટ હેન્ડલર મેસેજ પાસિંગ મોનાડ (ફંક્શનલ પ્રોગ્રામિંગ) ઓબ્ઝર્વર પેટર્ન પબ્લિશ/સબ્સ્ક્રાઇબ સર્વિસ લોકેટર પેટર્ન સિગ્નલ (કમ્પ્યુટિંગ) સોફ્ટવેર ફ્રેમવર્ક સ્ટ્રેટેજી પેટર્ન વપરાશકર્તા બહાર નીકળો મુલાકાતી પેટર્ન XSLT સંદર્ભો બાહ્ય કડીઓ નિયંત્રણ સમજૂતી અને અમલીકરણનું વ્યુત્ક્રમ ઉદાહરણ કંટ્રોલ સોફ્ટવેર આર્કિટેક્ચર આર્કિટેક્ચરલ પેટર્ન (કમ્પ્યુટર સાયન્સ) જાવા (પ્રોગ્રામિંગ લેંગ્વેજ) પ્રોગ્રામિંગ સિદ્ધાંતો કમ્પોનન્ટ-આધારિત સોફ્ટવેર એન્જિનિયરિંગ સોફ્ટવેર ડિઝાઇન પેટર્ન