લેગસી કોડને રિફેક્ટર કરવા માટે એક વ્યવહારુ માર્ગદર્શિકા, જેમાં ઓળખ, પ્રાથમિકતા, તકનીકો, અને આધુનિકીકરણ તથા જાળવણી માટેની શ્રેષ્ઠ પદ્ધતિઓનો સમાવેશ થાય છે.
જટિલ સિસ્ટમને કાબૂમાં લેવી: લેગસી કોડ માટે રિફેક્ટરિંગ વ્યૂહરચના
લેગસી કોડ. આ શબ્દ પોતે જ ઘણીવાર વિશાળ, બિનદસ્તાવેજીકૃત સિસ્ટમ્સ, નાજુક નિર્ભરતાઓ અને ડરની ભારે ભાવનાની છબીઓ રજૂ કરે છે. વિશ્વભરના ઘણા ડેવલપર્સ આ સિસ્ટમોને જાળવવા અને વિકસાવવાના પડકારનો સામનો કરે છે, જે ઘણીવાર વ્યવસાયિક કામગીરી માટે નિર્ણાયક હોય છે. આ વ્યાપક માર્ગદર્શિકા લેગસી કોડને રિફેક્ટર કરવા માટે વ્યવહારુ વ્યૂહરચનાઓ પ્રદાન કરે છે, જે નિરાશાના સ્ત્રોતને આધુનિકીકરણ અને સુધારણા માટેની તકમાં ફેરવે છે.
લેગસી કોડ શું છે?
રિફેક્ટરિંગ તકનીકોમાં ઊંડા ઉતરતા પહેલાં, "લેગસી કોડ" નો અર્થ શું છે તે વ્યાખ્યાયિત કરવું આવશ્યક છે. જ્યારે આ શબ્દ ફક્ત જૂના કોડનો ઉલ્લેખ કરી શકે છે, ત્યારે તેની જાળવણીક્ષમતા પર વધુ સૂક્ષ્મ વ્યાખ્યા કેન્દ્રિત છે. માઈકલ ફેધર્સ, તેમના મૂળભૂત પુસ્તક "Working Effectively with Legacy Code," માં, લેગસી કોડને ટેસ્ટ વિનાના કોડ તરીકે વ્યાખ્યાયિત કરે છે. ટેસ્ટના આ અભાવને કારણે રિગ્રેશન દાખલ કર્યા વિના કોડને સુરક્ષિત રીતે સંશોધિત કરવું મુશ્કેલ બને છે. જોકે, લેગસી કોડ અન્ય લાક્ષણિકતાઓ પણ પ્રદર્શિત કરી શકે છે:
- દસ્તાવેજીકરણનો અભાવ: મૂળ ડેવલપર્સ કદાચ આગળ વધી ગયા હોય, અને સિસ્ટમના આર્કિટેક્ચર, ડિઝાઇનના નિર્ણયો, અથવા તો મૂળભૂત કાર્યક્ષમતાને સમજાવતા બહુ ઓછા અથવા કોઈ દસ્તાવેજો પાછળ છોડી ગયા હોય.
- જટિલ નિર્ભરતાઓ: કોડ ચુસ્તપણે જોડાયેલો હોઈ શકે છે, જેના કારણે સિસ્ટમના અન્ય ભાગોને અસર કર્યા વિના વ્યક્તિગત ઘટકોને અલગ અને સંશોધિત કરવું મુશ્કેલ બને છે.
- જૂની ટેકનોલોજીઓ: કોડ જૂની પ્રોગ્રામિંગ ભાષાઓ, ફ્રેમવર્ક અથવા લાઇબ્રેરીઓનો ઉપયોગ કરીને લખાયેલો હોઈ શકે છે જે હવે સક્રિય રીતે સપોર્ટેડ નથી, જે સુરક્ષા જોખમો ઊભા કરે છે અને આધુનિક ટૂલિંગની ઍક્સેસને મર્યાદિત કરે છે.
- ખરાબ કોડ ગુણવત્તા: કોડમાં ડુપ્લિકેટ કોડ, લાંબી મેથડ્સ અને અન્ય કોડ સ્મેલ્સ હોઈ શકે છે જે તેને સમજવા અને જાળવવામાં મુશ્કેલ બનાવે છે.
- નાજુક ડિઝાઇન: નાના લાગતા ફેરફારોના અણધાર્યા અને વ્યાપક પરિણામો આવી શકે છે.
એ નોંધવું અગત્યનું છે કે લેગસી કોડ સ્વાભાવિક રીતે ખરાબ નથી. તે ઘણીવાર નોંધપાત્ર રોકાણનું પ્રતિનિધિત્વ કરે છે અને મૂલ્યવાન ડોમેન જ્ઞાનને સમાવે છે. રિફેક્ટરિંગનો ધ્યેય કોડની જાળવણીક્ષમતા, વિશ્વસનીયતા અને પ્રદર્શનમાં સુધારો કરતી વખતે આ મૂલ્યને સાચવવાનો છે.
લેગસી કોડનું રિફેક્ટરિંગ શા માટે કરવું?
લેગસી કોડનું રિફેક્ટરિંગ કરવું એ એક મુશ્કેલ કાર્ય હોઈ શકે છે, પરંતુ તેના ફાયદાઓ ઘણીવાર પડકારો કરતાં વધી જાય છે. અહીં રિફેક્ટરિંગમાં રોકાણ કરવાના કેટલાક મુખ્ય કારણો છે:
- સુધારેલી જાળવણીક્ષમતા: રિફેક્ટરિંગ કોડને સમજવા, સંશોધિત કરવા અને ડિબગ કરવાનું સરળ બનાવે છે, જે ચાલુ જાળવણી માટે જરૂરી ખર્ચ અને પ્રયત્નો ઘટાડે છે. વૈશ્વિક ટીમો માટે, આ ખાસ કરીને મહત્વપૂર્ણ છે, કારણ કે તે ચોક્કસ વ્યક્તિઓ પરની નિર્ભરતા ઘટાડે છે અને જ્ઞાનની વહેંચણીને પ્રોત્સાહન આપે છે.
- ઘટાડેલું ટેકનિકલ ડેટ: ટેકનિકલ ડેટ એ લાંબો સમય લેનારા વધુ સારા અભિગમનો ઉપયોગ કરવાને બદલે અત્યારે સરળ ઉપાય પસંદ કરવાથી થતા પુનઃકાર્યના ગર્ભિત ખર્ચનો ઉલ્લેખ કરે છે. રિફેક્ટરિંગ આ ડેટને ચૂકવવામાં મદદ કરે છે, જે કોડબેઝના એકંદર સ્વાસ્થ્યને સુધારે છે.
- વધેલી વિશ્વસનીયતા: કોડ સ્મેલ્સને સંબોધીને અને કોડની રચનામાં સુધારો કરીને, રિફેક્ટરિંગ બગ્સના જોખમને ઘટાડી શકે છે અને સિસ્ટમની એકંદર વિશ્વસનીયતામાં સુધારો કરી શકે છે.
- વધેલું પ્રદર્શન: રિફેક્ટરિંગ પ્રદર્શન અવરોધોને ઓળખી અને સંબોધી શકે છે, જેના પરિણામે ઝડપી એક્ઝેક્યુશન સમય અને સુધારેલ પ્રતિભાવ મળે છે.
- સરળ એકીકરણ: રિફેક્ટરિંગ લેગસી સિસ્ટમને નવી સિસ્ટમો અને ટેકનોલોજીઓ સાથે એકીકૃત કરવાનું સરળ બનાવી શકે છે, જે નવીનતા અને આધુનિકીકરણને સક્ષમ કરે છે. ઉદાહરણ તરીકે, યુરોપિયન ઈ-કોમર્સ પ્લેટફોર્મને નવા પેમેન્ટ ગેટવે સાથે એકીકૃત કરવાની જરૂર પડી શકે છે જે અલગ API નો ઉપયોગ કરે છે.
- સુધરેલ ડેવલપર મનોબળ: સ્વચ્છ, સુવ્યવસ્થિત કોડ સાથે કામ કરવું ડેવલપર્સ માટે વધુ આનંદદાયક અને ઉત્પાદક છે. રિફેક્ટરિંગ મનોબળ વધારી શકે છે અને પ્રતિભાઓને આકર્ષિત કરી શકે છે.
રિફેક્ટરિંગ ઉમેદવારોને ઓળખવા
બધા લેગસી કોડને રિફેક્ટર કરવાની જરૂર નથી. નીચેના પરિબળોના આધારે રિફેક્ટરિંગના પ્રયત્નોને પ્રાથમિકતા આપવી મહત્વપૂર્ણ છે:
- ફેરફારની આવર્તન: જે કોડમાં વારંવાર ફેરફાર કરવામાં આવે છે તે રિફેક્ટરિંગ માટે મુખ્ય ઉમેદવાર છે, કારણ કે જાળવણીક્ષમતામાં સુધારાથી વિકાસ ઉત્પાદકતા પર નોંધપાત્ર અસર પડશે.
- જટિલતા: જે કોડ જટિલ અને સમજવામાં મુશ્કેલ છે તેમાં બગ્સ હોવાની શક્યતા વધુ હોય છે અને તેને સુરક્ષિત રીતે સંશોધિત કરવું વધુ મુશ્કેલ હોય છે.
- બગ્સની અસર: જે કોડ વ્યવસાયિક કામગીરી માટે નિર્ણાયક છે અથવા જેમાં ખર્ચાળ ભૂલો થવાનું ઊંચું જોખમ છે તેને રિફેક્ટરિંગ માટે પ્રાથમિકતા આપવી જોઈએ.
- પ્રદર્શન અવરોધો: જે કોડને પ્રદર્શન અવરોધ તરીકે ઓળખવામાં આવે છે તેને પ્રદર્શન સુધારવા માટે રિફેક્ટર કરવો જોઈએ.
- કોડ સ્મેલ્સ: લાંબી મેથડ્સ, મોટા ક્લાસીસ, ડુપ્લિકેટ કોડ અને ફીચર એન્વી જેવી સામાન્ય કોડ સ્મેલ્સ પર નજર રાખો. આ એવા વિસ્તારોના સૂચક છે જેમને રિફેક્ટરિંગથી ફાયદો થઈ શકે છે.
ઉદાહરણ: શિપમેન્ટનું સંચાલન કરવા માટે લેગસી સિસ્ટમ ધરાવતી વૈશ્વિક લોજિસ્ટિક્સ કંપનીની કલ્પના કરો. શિપિંગ ખર્ચની ગણતરી માટે જવાબદાર મોડ્યુલ બદલાતા નિયમો અને બળતણના ભાવને કારણે વારંવાર અપડેટ થાય છે. આ મોડ્યુલ રિફેક્ટરિંગ માટે મુખ્ય ઉમેદવાર છે.
રિફેક્ટરિંગ તકનીકો
અસંખ્ય રિફેક્ટરિંગ તકનીકો ઉપલબ્ધ છે, દરેક ચોક્કસ કોડ સ્મેલ્સને સંબોધવા અથવા કોડના ચોક્કસ પાસાઓને સુધારવા માટે ડિઝાઇન કરાયેલ છે. અહીં કેટલીક સામાન્ય રીતે વપરાતી તકનીકો છે:
કમ્પોઝિંગ મેથડ્સ
આ તકનીકો મોટી, જટિલ મેથડ્સને નાની, વધુ વ્યવસ્થાપિત મેથડ્સમાં વિભાજીત કરવા પર ધ્યાન કેન્દ્રિત કરે છે. આ વાંચનીયતા સુધારે છે, ડુપ્લિકેશન ઘટાડે છે, અને કોડને ટેસ્ટ કરવાનું સરળ બનાવે છે.
- એક્સટ્રેક્ટ મેથડ (Extract Method): આમાં એક ચોક્કસ કાર્ય કરતા કોડના બ્લોકને ઓળખીને તેને નવી મેથડમાં ખસેડવાનો સમાવેશ થાય છે.
- ઇનલાઇન મેથડ (Inline Method): આમાં મેથડ કોલને મેથડની બોડી સાથે બદલવાનો સમાવેશ થાય છે. આનો ઉપયોગ ત્યારે કરો જ્યારે મેથડનું નામ તેની બોડી જેટલું જ સ્પષ્ટ હોય, અથવા જ્યારે તમે એક્સટ્રેક્ટ મેથડનો ઉપયોગ કરવાના હોવ પરંતુ હાલની મેથડ ખૂબ ટૂંકી હોય.
- ટેમ્પને ક્વેરીથી બદલો (Replace Temp with Query): આમાં એક કામચલાઉ વેરિયેબલને મેથડ કોલથી બદલવાનો સમાવેશ થાય છે જે માંગ પર વેરિયેબલનું મૂલ્ય ગણે છે.
- સમજાવનાર વેરિયેબલ દાખલ કરો (Introduce Explaining Variable): આનો ઉપયોગ કોઈ એક્સપ્રેશનના પરિણામને વર્ણનાત્મક નામવાળા વેરિયેબલને સોંપવા માટે કરો, જે તેના હેતુને સ્પષ્ટ કરે છે.
ઓબ્જેક્ટ્સ વચ્ચે ફીચર્સ ખસેડવા
આ તકનીકો જવાબદારીઓને જ્યાં હોવી જોઈએ ત્યાં ખસેડીને ક્લાસીસ અને ઓબ્જેક્ટ્સની ડિઝાઇન સુધારવા પર ધ્યાન કેન્દ્રિત કરે છે.
- મૂવ મેથડ (Move Method): આમાં એક મેથડને એક ક્લાસમાંથી બીજા ક્લાસમાં ખસેડવાનો સમાવેશ થાય છે જ્યાં તે તાર્કિક રીતે સંબંધિત છે.
- મૂવ ફીલ્ડ (Move Field): આમાં એક ફીલ્ડને એક ક્લાસમાંથી બીજા ક્લાસમાં ખસેડવાનો સમાવેશ થાય છે જ્યાં તે તાર્કિક રીતે સંબંધિત છે.
- એક્સટ્રેક્ટ ક્લાસ (Extract Class): આમાં હાલના ક્લાસમાંથી કાઢવામાં આવેલી સુસંગત જવાબદારીઓના સમૂહમાંથી નવો ક્લાસ બનાવવાનો સમાવેશ થાય છે.
- ઇનલાઇન ક્લાસ (Inline Class): જ્યારે કોઈ ક્લાસ તેના અસ્તિત્વને ન્યાયી ઠેરવવા માટે પૂરતું કામ ન કરતો હોય ત્યારે તેને બીજા ક્લાસમાં મર્જ કરવા માટે આનો ઉપયોગ કરો.
- ડેલિગેટ છુપાવો (Hide Delegate): આમાં ક્લાયન્ટ અને ડેલિગેટ વચ્ચેના જોડાણને ઘટાડીને, ક્લાયન્ટથી ડેલિગેશન લોજિકને છુપાવવા માટે સર્વરમાં મેથડ બનાવવાનો સમાવેશ થાય છે.
- વચેટિયાને દૂર કરો (Remove Middle Man): જો કોઈ ક્લાસ તેના લગભગ તમામ કામનું ડેલિગેશન કરતો હોય, તો આ વચેટિયાને દૂર કરવામાં મદદ કરે છે.
- વિદેશી મેથડ દાખલ કરો (Introduce Foreign Method): ક્લાયન્ટને એવી સુવિધાઓ પ્રદાન કરવા માટે ક્લાયન્ટ ક્લાસમાં એક મેથડ ઉમેરે છે જેની ખરેખર સર્વર ક્લાસમાંથી જરૂર હોય છે, પરંતુ એક્સેસના અભાવ અથવા સર્વર ક્લાસમાં આયોજિત ફેરફારોને કારણે તેમાં ફેરફાર કરી શકાતો નથી.
- સ્થાનિક એક્સ્ટેંશન દાખલ કરો (Introduce Local Extension): એક નવો ક્લાસ બનાવે છે જેમાં નવી મેથડ્સ હોય છે. જ્યારે તમે ક્લાસના સ્રોતને નિયંત્રિત ન કરતા હો અને સીધું વર્તન ઉમેરી શકતા ન હો ત્યારે ઉપયોગી છે.
ડેટાનું આયોજન
આ તકનીકો ડેટાને જે રીતે સંગ્રહિત અને એક્સેસ કરવામાં આવે છે તેને સુધારવા પર ધ્યાન કેન્દ્રિત કરે છે, જે તેને સમજવા અને સંશોધિત કરવાનું સરળ બનાવે છે.
- ડેટા વેલ્યુને ઓબ્જેક્ટથી બદલો (Replace Data Value with Object): આમાં સાદા ડેટા વેલ્યુને એવા ઓબ્જેક્ટથી બદલવાનો સમાવેશ થાય છે જે સંબંધિત ડેટા અને વર્તનને સમાવે છે.
- વેલ્યુને રેફરન્સમાં બદલો (Change Value to Reference): જ્યારે બહુવિધ ઓબ્જેક્ટ્સ સમાન વેલ્યુ શેર કરતા હોય ત્યારે વેલ્યુ ઓબ્જેક્ટને રેફરન્સ ઓબ્જેક્ટમાં બદલવાનો સમાવેશ થાય છે.
- એકપક્ષીય એસોસિએશનને દ્વિપક્ષીયમાં બદલો (Change Unidirectional Association to Bidirectional): બે ક્લાસ વચ્ચે દ્વિપક્ષીય લિંક બનાવે છે જ્યાં ફક્ત એક-માર્ગીય લિંક અસ્તિત્વમાં છે.
- દ્વિપક્ષીય એસોસિએશનને એકપક્ષીયમાં બદલો (Change Bidirectional Association to Unidirectional): બે-માર્ગીય સંબંધને એક-માર્ગીય બનાવીને એસોસિએશનને સરળ બનાવે છે.
- મેજિક નંબરને સિમ્બોલિક કોન્સ્ટન્ટથી બદલો (Replace Magic Number with Symbolic Constant): આમાં લિટરલ વેલ્યુને નામના કોન્સ્ટન્ટથી બદલવાનો સમાવેશ થાય છે, જે કોડને સમજવા અને જાળવવામાં સરળ બનાવે છે.
- ફીલ્ડને એન્કેપ્સ્યુલેટ કરો (Encapsulate Field): ફીલ્ડને એક્સેસ કરવા માટે ગેટર અને સેટર મેથડ પ્રદાન કરે છે.
- કલેક્શનને એન્કેપ્સ્યુલેટ કરો (Encapsulate Collection): સુનિશ્ચિત કરે છે કે કલેક્શનમાં થતા તમામ ફેરફારો માલિક ક્લાસમાં કાળજીપૂર્વક નિયંત્રિત મેથડ્સ દ્વારા થાય છે.
- રેકોર્ડને ડેટા ક્લાસથી બદલો (Replace Record with Data Class): રેકોર્ડની રચના અને એક્સેસર મેથડ્સ સાથે મેળ ખાતા ફીલ્ડ્સ સાથે નવો ક્લાસ બનાવે છે.
- ટાઇપ કોડને ક્લાસથી બદલો (Replace Type Code with Class): જ્યારે ટાઇપ કોડમાં સંભવિત મૂલ્યોનો મર્યાદિત, જાણીતો સમૂહ હોય ત્યારે નવો ક્લાસ બનાવો.
- ટાઇપ કોડને સબક્લાસથી બદલો (Replace Type Code with Subclasses): જ્યારે ટાઇપ કોડ મૂલ્ય ક્લાસના વર્તનને અસર કરતું હોય ત્યારે.
- ટાઇપ કોડને સ્ટેટ/સ્ટ્રેટેજીથી બદલો (Replace Type Code with State/Strategy): જ્યારે ટાઇપ કોડ મૂલ્ય ક્લાસના વર્તનને અસર કરતું હોય, પરંતુ સબક્લાસિંગ યોગ્ય ન હોય ત્યારે.
- સબક્લાસને ફીલ્ડ્સથી બદલો (Replace Subclass with Fields): સબક્લાસને દૂર કરે છે અને સુપરક્લાસમાં સબક્લાસની વિશિષ્ટ ગુણધર્મોનું પ્રતિનિધિત્વ કરતા ફીલ્ડ્સ ઉમેરે છે.
શરતી અભિવ્યક્તિઓને સરળ બનાવવી
શરતી લોજિક ઝડપથી જટિલ બની શકે છે. આ તકનીકો સ્પષ્ટતા અને સરળીકરણ કરવાનો હેતુ ધરાવે છે.
- શરતનું વિઘટન કરો (Decompose Conditional): આમાં જટિલ શરતી વિધાનને નાના, વધુ વ્યવસ્થાપિત ટુકડાઓમાં તોડવાનો સમાવેશ થાય છે.
- શરતી અભિવ્યક્તિને એકીકૃત કરો (Consolidate Conditional Expression): આમાં બહુવિધ શરતી વિધાનોને એક જ, વધુ સંક્ષિપ્ત વિધાનમાં જોડવાનો સમાવેશ થાય છે.
- ડુપ્લિકેટ શરતી ટુકડાઓને એકીકૃત કરો (Consolidate Duplicate Conditional Fragments): આમાં શરતી વિધાનની બહુવિધ શાખાઓમાં ડુપ્લિકેટ થયેલા કોડને શરતી વિધાનની બહાર ખસેડવાનો સમાવેશ થાય છે.
- કંટ્રોલ ફ્લેગ દૂર કરો (Remove Control Flag): લોજિકના પ્રવાહને નિયંત્રિત કરવા માટે વપરાતા બુલિયન વેરિયેબલ્સને દૂર કરો.
- નેસ્ટેડ શરતને ગાર્ડ ક્લોઝથી બદલો (Replace Nested Conditional with Guard Clauses): બધા વિશેષ કિસ્સાઓને ટોચ પર મૂકીને અને જો તેમાંથી કોઈ સાચું હોય તો પ્રોસેસિંગ બંધ કરીને કોડને વધુ વાંચનીય બનાવે છે.
- શરતને પોલીમોર્ફિઝમથી બદલો (Replace Conditional with Polymorphism): આમાં શરતી લોજિકને પોલીમોર્ફિઝમથી બદલવાનો સમાવેશ થાય છે, જે વિવિધ ઓબ્જેક્ટ્સને વિવિધ કેસોને હેન્ડલ કરવાની મંજૂરી આપે છે.
- નલ ઓબ્જેક્ટ દાખલ કરો (Introduce Null Object): નલ વેલ્યુ માટે તપાસ કરવાને બદલે, એક ડિફોલ્ટ ઓબ્જેક્ટ બનાવો જે ડિફોલ્ટ વર્તન પ્રદાન કરે છે.
- એસર્શન દાખલ કરો (Introduce Assertion): અપેક્ષાઓનું પરીક્ષણ કરતો ટેસ્ટ બનાવીને સ્પષ્ટપણે દસ્તાવેજીકરણ કરો.
મેથડ કોલ્સને સરળ બનાવવી
- મેથડનું નામ બદલો (Rename Method): આ સ્પષ્ટ લાગે છે, પરંતુ કોડને સ્પષ્ટ બનાવવામાં અત્યંત મદદરૂપ છે.
- પેરામીટર ઉમેરો (Add Parameter): મેથડ સિગ્નેચરમાં માહિતી ઉમેરવાથી મેથડ વધુ લવચીક અને પુનઃઉપયોગી બને છે.
- પેરામીટર દૂર કરો (Remove Parameter): જો કોઈ પેરામીટરનો ઉપયોગ ન થતો હોય, તો ઇન્ટરફેસને સરળ બનાવવા માટે તેને દૂર કરો.
- ક્વેરીને મોડિફાયરથી અલગ કરો (Separate Query from Modifier): જો કોઈ મેથડ મૂલ્ય બદલે અને પરત કરે બંને, તો તેને બે અલગ-અલગ મેથડમાં વિભાજીત કરો.
- મેથડને પેરામીટરાઇઝ કરો (Parameterize Method): આનો ઉપયોગ સમાન મેથડ્સને એક જ મેથડમાં એકીકૃત કરવા માટે કરો જેમાં એક પેરામીટર વર્તનને બદલે છે.
- પેરામીટરને સ્પષ્ટ મેથડ્સથી બદલો (Replace Parameter with Explicit Methods): પેરામીટરાઇઝનું ઊલટું કરો - એક જ મેથડને બહુવિધ મેથડ્સમાં વિભાજીત કરો જે દરેક પેરામીટરના ચોક્કસ મૂલ્યનું પ્રતિનિધિત્વ કરે છે.
- આખા ઓબ્જેક્ટને સાચવો (Preserve Whole Object): મેથડને થોડા ચોક્કસ ડેટા આઇટમ્સ પાસ કરવાને બદલે, આખો ઓબ્જેક્ટ પાસ કરો જેથી મેથડને તેના તમામ ડેટાની ઍક્સેસ મળે.
- પેરામીટરને મેથડથી બદલો (Replace Parameter with Method): જો કોઈ મેથડ હંમેશા ફીલ્ડમાંથી મેળવેલા સમાન મૂલ્ય સાથે કોલ થતી હોય, તો મેથડની અંદર પેરામીટર મૂલ્ય મેળવવાનું વિચારો.
- પેરામીટર ઓબ્જેક્ટ દાખલ કરો (Introduce Parameter Object): જ્યારે કેટલાક પેરામીટર્સ કુદરતી રીતે એક સાથે હોય ત્યારે તેમને એક ઓબ્જેક્ટમાં જૂથબદ્ધ કરો.
- સેટિંગ મેથડ દૂર કરો (Remove Setting Method): જો ફીલ્ડ ફક્ત પ્રારંભિક હોવું જોઈએ, પરંતુ કન્સ્ટ્રક્શન પછી સંશોધિત ન થવું જોઈએ તો સેટર્સ ટાળો.
- મેથડ છુપાવો (Hide Method): જો કોઈ મેથડનો ઉપયોગ ફક્ત એક જ ક્લાસમાં થતો હોય તો તેની દૃશ્યતા ઘટાડો.
- કન્સ્ટ્રક્ટરને ફેક્ટરી મેથડથી બદલો (Replace Constructor with Factory Method): કન્સ્ટ્રક્ટરનો વધુ વર્ણનાત્મક વિકલ્પ.
- અપવાદને ટેસ્ટથી બદલો (Replace Exception with Test): જો અપવાદોનો ઉપયોગ ફ્લો કંટ્રોલ તરીકે થતો હોય, તો પ્રદર્શન સુધારવા માટે તેમને શરતી લોજિકથી બદલો.
જનરલાઇઝેશન સાથે કામ કરવું
- ફીલ્ડ ઉપર ખેંચો (Pull Up Field): સબક્લાસમાંથી ફીલ્ડને તેના સુપરક્લાસમાં ખસેડો.
- મેથડ ઉપર ખેંચો (Pull Up Method): સબક્લાસમાંથી મેથડને તેના સુપરક્લાસમાં ખસેડો.
- કન્સ્ટ્રક્ટર બોડી ઉપર ખેંચો (Pull Up Constructor Body): કન્સ્ટ્રક્ટરની બોડીને સબક્લાસમાંથી તેના સુપરક્લાસમાં ખસેડો.
- મેથડ નીચે ધકેલો (Push Down Method): સુપરક્લાસમાંથી મેથડને તેના સબક્લાસમાં ખસેડો.
- ફીલ્ડ નીચે ધકેલો (Push Down Field): સુપરક્લાસમાંથી ફીલ્ડને તેના સબક્લાસમાં ખસેડો.
- ઇન્ટરફેસ એક્સટ્રેક્ટ કરો (Extract Interface): ક્લાસની પબ્લિક મેથડ્સમાંથી ઇન્ટરફેસ બનાવે છે.
- સુપરક્લાસ એક્સટ્રેક્ટ કરો (Extract Superclass): બે ક્લાસમાંથી સામાન્ય કાર્યક્ષમતાને નવા સુપરક્લાસમાં ખસેડો.
- હાઇરાર્કીને સંકુચિત કરો (Collapse Hierarchy): સુપરક્લાસ અને સબક્લાસને એક જ ક્લાસમાં જોડો.
- ટેમ્પલેટ મેથડ બનાવો (Form Template Method): સુપરક્લાસમાં એક ટેમ્પલેટ મેથડ બનાવો જે અલ્ગોરિધમના પગલાંને વ્યાખ્યાયિત કરે છે, જે સબક્લાસને ચોક્કસ પગલાંને ઓવરરાઇડ કરવાની મંજૂરી આપે છે.
- ઇન્હેરિટન્સને ડેલિગેશનથી બદલો (Replace Inheritance with Delegation): કાર્યક્ષમતાને વારસામાં મેળવવાને બદલે, તેને સંદર્ભિત કરતા ક્લાસમાં ફીલ્ડ બનાવો.
- ડેલિગેશનને ઇન્હેરિટન્સથી બદલો (Replace Delegation with Inheritance): જ્યારે ડેલિગેશન ખૂબ જટિલ હોય, ત્યારે ઇન્હેરિટન્સ પર સ્વિચ કરો.
આ ઉપલબ્ધ ઘણી રિફેક્ટરિંગ તકનીકોના માત્ર થોડા ઉદાહરણો છે. કઈ તકનીકનો ઉપયોગ કરવો તેની પસંદગી ચોક્કસ કોડ સ્મેલ અને ઇચ્છિત પરિણામ પર આધાર રાખે છે.
ઉદાહરણ: એક વૈશ્વિક બેંક દ્વારા ઉપયોગમાં લેવાતી જાવા એપ્લિકેશનમાં એક મોટી મેથડ વ્યાજ દરોની ગણતરી કરે છે. નાની, વધુ કેન્દ્રિત મેથડ્સ બનાવવા માટે એક્સટ્રેક્ટ મેથડ નો ઉપયોગ કરવાથી વાંચનીયતા સુધરે છે અને મેથડના અન્ય ભાગોને અસર કર્યા વિના વ્યાજ દરની ગણતરીના લોજિકને અપડેટ કરવાનું સરળ બને છે.
રિફેક્ટરિંગ પ્રક્રિયા
જોખમ ઘટાડવા અને સફળતાની તકો વધારવા માટે રિફેક્ટરિંગને વ્યવસ્થિત રીતે અપનાવવું જોઈએ. અહીં એક ભલામણ કરેલ પ્રક્રિયા છે:
- રિફેક્ટરિંગ ઉમેદવારોને ઓળખો: કોડના એવા ક્ષેત્રોને ઓળખવા માટે અગાઉ ઉલ્લેખિત માપદંડોનો ઉપયોગ કરો જેમને રિફેક્ટરિંગથી સૌથી વધુ ફાયદો થશે.
- ટેસ્ટ બનાવો: કોઈપણ ફેરફાર કરતા પહેલા, કોડના હાલના વર્તનને ચકાસવા માટે ઓટોમેટેડ ટેસ્ટ લખો. રિફેક્ટરિંગથી રિગ્રેશન ન થાય તે સુનિશ્ચિત કરવા માટે આ નિર્ણાયક છે. JUnit (જાવા), pytest (પાયથોન), અથવા Jest (જાવાસ્ક્રિપ્ટ) જેવા ટૂલ્સનો ઉપયોગ યુનિટ ટેસ્ટ લખવા માટે કરી શકાય છે.
- વધારાત્મક રીતે રિફેક્ટર કરો: નાના, વધારાત્મક ફેરફારો કરો અને દરેક ફેરફાર પછી ટેસ્ટ ચલાવો. આનાથી કોઈપણ ભૂલોને ઓળખવી અને સુધારવી સરળ બને છે.
- વારંવાર કમિટ કરો: તમારા ફેરફારોને વર્ઝન કંટ્રોલમાં વારંવાર કમિટ કરો. આનાથી જો કંઈક ખોટું થાય તો પાછલા વર્ઝન પર સરળતાથી પાછા ફરી શકાય છે.
- કોડની સમીક્ષા કરો: તમારા કોડની સમીક્ષા બીજા ડેવલપર દ્વારા કરાવો. આ સંભવિત સમસ્યાઓને ઓળખવામાં અને રિફેક્ટરિંગ યોગ્ય રીતે થયું છે તેની ખાતરી કરવામાં મદદ કરી શકે છે.
- પ્રદર્શનનું નિરીક્ષણ કરો: રિફેક્ટરિંગ પછી, સિસ્ટમના પ્રદર્શનનું નિરીક્ષણ કરો જેથી ખાતરી કરી શકાય કે ફેરફારોથી કોઈ પ્રદર્શન રિગ્રેશન થયું નથી.
ઉદાહરણ: વૈશ્વિક ઈ-કોમર્સ પ્લેટફોર્મમાં પાયથોન મોડ્યુલનું રિફેક્ટરિંગ કરતી એક ટીમ હાલની કાર્યક્ષમતા માટે યુનિટ ટેસ્ટ બનાવવા માટે `pytest` નો ઉપયોગ કરે છે. પછી તેઓ ચિંતાઓને અલગ કરવા અને મોડ્યુલની રચના સુધારવા માટે એક્સટ્રેક્ટ ક્લાસ રિફેક્ટરિંગ લાગુ કરે છે. દરેક નાના ફેરફાર પછી, તેઓ કાર્યક્ષમતા યથાવત રહે તેની ખાતરી કરવા માટે ટેસ્ટ ચલાવે છે.
લેગસી કોડમાં ટેસ્ટ દાખલ કરવાની વ્યૂહરચના
જેમ કે માઈકલ ફેધર્સે યોગ્ય રીતે કહ્યું છે, લેગસી કોડ એ ટેસ્ટ વિનાનો કોડ છે. હાલના કોડબેઝમાં ટેસ્ટ દાખલ કરવું એ એક મોટું કાર્ય લાગી શકે છે, પરંતુ તે સુરક્ષિત રિફેક્ટરિંગ માટે આવશ્યક છે. આ કાર્યનો સામનો કરવા માટે અહીં કેટલીક વ્યૂહરચનાઓ છે:
કેરેક્ટરાઇઝેશન ટેસ્ટ (ઉર્ફે ગોલ્ડન માસ્ટર ટેસ્ટ)
જ્યારે તમે એવા કોડ સાથે કામ કરી રહ્યા હોવ જે સમજવો મુશ્કેલ હોય, ત્યારે કેરેક્ટરાઇઝેશન ટેસ્ટ તમને ફેરફારો કરવાનું શરૂ કરતા પહેલા તેના હાલના વર્તનને કેપ્ચર કરવામાં મદદ કરી શકે છે. વિચાર એ છે કે એવા ટેસ્ટ લખવા જે આપેલ ઇનપુટ્સના સમૂહ માટે કોડના વર્તમાન આઉટપુટને પ્રમાણિત કરે છે. આ ટેસ્ટ્સ આવશ્યકપણે સાચીતાની ચકાસણી કરતા નથી; તેઓ ફક્ત દસ્તાવેજીકરણ કરે છે કે કોડ *હાલમાં* શું કરે છે.
પગલાં:
- કોડના એકમની ઓળખ કરો જેને તમે કેરેક્ટરાઇઝ કરવા માંગો છો (દા.ત., ફંક્શન અથવા મેથડ).
- ઇનપુટ મૂલ્યોનો સમૂહ બનાવો જે સામાન્ય અને એજ-કેસ દૃશ્યોની શ્રેણીનું પ્રતિનિધિત્વ કરે છે.
- તે ઇનપુટ્સ સાથે કોડ ચલાવો અને પરિણામી આઉટપુટ કેપ્ચર કરો.
- એવા ટેસ્ટ લખો જે પ્રમાણિત કરે કે કોડ તે ઇનપુટ્સ માટે તે જ આઉટપુટ ઉત્પન્ન કરે છે.
સાવચેતી: જો અંતર્ગત લોજિક જટિલ અથવા ડેટા-આધારિત હોય તો કેરેક્ટરાઇઝેશન ટેસ્ટ નાજુક હોઈ શકે છે. જો તમારે પછીથી કોડના વર્તનને બદલવાની જરૂર હોય તો તેમને અપડેટ કરવા માટે તૈયાર રહો.
સ્પ્રાઉટ મેથડ અને સ્પ્રાઉટ ક્લાસ
આ તકનીકો, જે માઈકલ ફેધર્સ દ્વારા પણ વર્ણવવામાં આવી છે, તેનો હેતુ હાલના કોડને તોડવાના જોખમને ઓછું કરીને લેગસી સિસ્ટમમાં નવી કાર્યક્ષમતા દાખલ કરવાનો છે.
સ્પ્રાઉટ મેથડ: જ્યારે તમારે નવી સુવિધા ઉમેરવાની જરૂર હોય જેમાં હાલની મેથડમાં ફેરફાર કરવાની જરૂર હોય, ત્યારે નવી લોજિક ધરાવતી નવી મેથડ બનાવો. પછી, હાલની મેથડમાંથી આ નવી મેથડને કોલ કરો. આ તમને નવા કોડને અલગ કરવા અને તેને સ્વતંત્ર રીતે ટેસ્ટ કરવાની મંજૂરી આપે છે.
સ્પ્રાઉટ ક્લાસ: સ્પ્રાઉટ મેથડ જેવું જ, પરંતુ ક્લાસીસ માટે. નવી કાર્યક્ષમતાને અમલમાં મૂકતો નવો ક્લાસ બનાવો, અને પછી તેને હાલની સિસ્ટમમાં એકીકૃત કરો.
સેન્ડબોક્સિંગ
સેન્ડબોક્સિંગમાં લેગસી કોડને સિસ્ટમના બાકીના ભાગથી અલગ કરવાનો સમાવેશ થાય છે, જે તમને તેને નિયંત્રિત વાતાવરણમાં ટેસ્ટ કરવાની મંજૂરી આપે છે. આ નિર્ભરતાઓ માટે મોક્સ અથવા સ્ટબ્સ બનાવીને અથવા વર્ચ્યુઅલ મશીનમાં કોડ ચલાવીને કરી શકાય છે.
મિકાડો મેથડ
મિકાડો મેથડ જટિલ રિફેક્ટરિંગ કાર્યોનો સામનો કરવા માટે એક વિઝ્યુઅલ સમસ્યા-નિવારણ અભિગમ છે. તેમાં કોડના વિવિધ ભાગો વચ્ચેની નિર્ભરતાઓનું પ્રતિનિધિત્વ કરતો ડાયાગ્રામ બનાવવાનો અને પછી કોડને એવી રીતે રિફેક્ટર કરવાનો સમાવેશ થાય છે જે સિસ્ટમના અન્ય ભાગો પરની અસરને ઓછી કરે. મુખ્ય સિદ્ધાંત એ છે કે ફેરફારનો "પ્રયાસ કરો" અને જુઓ કે શું તૂટે છે. જો તે તૂટે છે, તો છેલ્લી કાર્યરત સ્થિતિ પર પાછા ફરો અને સમસ્યાને રેકોર્ડ કરો. પછી મૂળ ફેરફારનો ફરીથી પ્રયાસ કરતા પહેલા તે સમસ્યાનું નિરાકરણ કરો.
રિફેક્ટરિંગ માટેના સાધનો
કેટલાક સાધનો રિફેક્ટરિંગમાં મદદ કરી શકે છે, પુનરાવર્તિત કાર્યોને સ્વચાલિત કરી શકે છે અને શ્રેષ્ઠ પદ્ધતિઓ પર માર્ગદર્શન પૂરું પાડી શકે છે. આ સાધનો ઘણીવાર ઇન્ટિગ્રેટેડ ડેવલપમેન્ટ એન્વાયર્નમેન્ટ્સ (IDEs) માં સંકલિત હોય છે:
- IDEs (દા.ત., IntelliJ IDEA, Eclipse, Visual Studio): IDEs બિલ્ટ-ઇન રિફેક્ટરિંગ ટૂલ્સ પ્રદાન કરે છે જે વેરિયેબલ્સનું નામ બદલવા, મેથડ્સ એક્સટ્રેક્ટ કરવા અને ક્લાસીસ ખસેડવા જેવા કાર્યોને આપમેળે કરી શકે છે.
- સ્ટેટિક એનાલિસિસ ટૂલ્સ (દા.ત., SonarQube, Checkstyle, PMD): આ ટૂલ્સ કોડ સ્મેલ્સ, સંભવિત બગ્સ અને સુરક્ષા નબળાઈઓ માટે કોડનું વિશ્લેષણ કરે છે. તેઓ કોડના એવા ક્ષેત્રોને ઓળખવામાં મદદ કરી શકે છે જેમને રિફેક્ટરિંગથી ફાયદો થશે.
- કોડ કવરેજ ટૂલ્સ (દા.ત., JaCoCo, Cobertura): આ ટૂલ્સ ટેસ્ટ દ્વારા આવરી લેવાયેલા કોડની ટકાવારી માપે છે. તેઓ કોડના એવા ક્ષેત્રોને ઓળખવામાં મદદ કરી શકે છે જે પર્યાપ્ત રીતે ટેસ્ટ કરેલા નથી.
- રિફેક્ટરિંગ બ્રાઉઝર્સ (દા.ત., Smalltalk Refactoring Browser): વિશિષ્ટ સાધનો જે મોટી પુનર્રચના પ્રવૃત્તિઓમાં સહાય કરે છે.
ઉદાહરણ: વૈશ્વિક વીમા કંપની માટે C# એપ્લિકેશન પર કામ કરતી એક ડેવલપમેન્ટ ટીમ વેરિયેબલ્સનું નામ આપમેળે બદલવા અને મેથડ્સ એક્સટ્રેક્ટ કરવા માટે વિઝ્યુઅલ સ્ટુડિયોના બિલ્ટ-ઇન રિફેક્ટરિંગ ટૂલ્સનો ઉપયોગ કરે છે. તેઓ કોડ સ્મેલ્સ અને સંભવિત નબળાઈઓને ઓળખવા માટે SonarQube નો પણ ઉપયોગ કરે છે.
પડકારો અને જોખમો
લેગસી કોડનું રિફેક્ટરિંગ તેના પડકારો અને જોખમો વિના નથી:
- રિગ્રેશન દાખલ કરવું: સૌથી મોટું જોખમ રિફેક્ટરિંગ પ્રક્રિયા દરમિયાન બગ્સ દાખલ કરવાનું છે. વ્યાપક ટેસ્ટ લખીને અને વધારાત્મક રીતે રિફેક્ટર કરીને આને ઘટાડી શકાય છે.
- ડોમેન જ્ઞાનનો અભાવ: જો મૂળ ડેવલપર્સ આગળ વધી ગયા હોય, તો કોડ અને તેના હેતુને સમજવું મુશ્કેલ બની શકે છે. આ ખોટા રિફેક્ટરિંગ નિર્ણયો તરફ દોરી શકે છે.
- ચુસ્ત જોડાણ: ચુસ્તપણે જોડાયેલ કોડને રિફેક્ટર કરવું વધુ મુશ્કેલ છે, કારણ કે કોડના એક ભાગમાં ફેરફારની કોડના અન્ય ભાગો પર અનિચ્છનીય અસરો થઈ શકે છે.
- સમયની મર્યાદાઓ: રિફેક્ટરિંગમાં સમય લાગી શકે છે, અને નવી સુવિધાઓ પહોંચાડવા પર ધ્યાન કેન્દ્રિત કરનારા હિસ્સેદારોને રોકાણને ન્યાયી ઠેરવવું મુશ્કેલ બની શકે છે.
- ફેરફારનો પ્રતિકાર: કેટલાક ડેવલપર્સ રિફેક્ટરિંગનો પ્રતિકાર કરી શકે છે, ખાસ કરીને જો તેઓ તેમાં સામેલ તકનીકોથી પરિચિત ન હોય.
શ્રેષ્ઠ પદ્ધતિઓ
લેગસી કોડના રિફેક્ટરિંગ સાથે સંકળાયેલા પડકારો અને જોખમોને ઘટાડવા માટે, આ શ્રેષ્ઠ પદ્ધતિઓનું પાલન કરો:
- સંમતિ મેળવો: સુનિશ્ચિત કરો કે હિસ્સેદારો રિફેક્ટરિંગના ફાયદા સમજે છે અને જરૂરી સમય અને સંસાધનોનું રોકાણ કરવા તૈયાર છે.
- નાનાથી શરૂ કરો: કોડના નાના, અલગ ટુકડાઓને રિફેક્ટર કરીને પ્રારંભ કરો. આ આત્મવિશ્વાસ વધારવામાં અને રિફેક્ટરિંગનું મૂલ્ય દર્શાવવામાં મદદ કરશે.
- વધારાત્મક રીતે રિફેક્ટર કરો: નાના, વધારાત્મક ફેરફારો કરો અને વારંવાર ટેસ્ટ કરો. આનાથી કોઈપણ ભૂલોને ઓળખવી અને સુધારવી સરળ બનશે.
- ટેસ્ટને સ્વચાલિત કરો: રિફેક્ટરિંગ પહેલાં અને પછી કોડના વર્તનને ચકાસવા માટે વ્યાપક ઓટોમેટેડ ટેસ્ટ લખો.
- રિફેક્ટરિંગ ટૂલ્સનો ઉપયોગ કરો: પુનરાવર્તિત કાર્યોને સ્વચાલિત કરવા અને શ્રેષ્ઠ પદ્ધતિઓ પર માર્ગદર્શન પૂરું પાડવા માટે તમારા IDE અથવા અન્ય ટૂલ્સમાં ઉપલબ્ધ રિફેક્ટરિંગ ટૂલ્સનો લાભ લો.
- તમારા ફેરફારોનું દસ્તાવેજીકરણ કરો: રિફેક્ટરિંગ દરમિયાન તમે જે ફેરફારો કરો છો તેનું દસ્તાવેજીકરણ કરો. આ અન્ય ડેવલપર્સને કોડ સમજવામાં અને ભવિષ્યમાં રિગ્રેશન દાખલ કરવાનું ટાળવામાં મદદ કરશે.
- સતત રિફેક્ટરિંગ: રિફેક્ટરિંગને એક-વખતની ઘટનાને બદલે વિકાસ પ્રક્રિયાનો સતત ભાગ બનાવો. આ કોડબેઝને સ્વચ્છ અને જાળવવા યોગ્ય રાખવામાં મદદ કરશે.
નિષ્કર્ષ
લેગસી કોડનું રિફેક્ટરિંગ એક પડકારજનક પરંતુ લાભદાયી પ્રયાસ છે. આ માર્ગદર્શિકામાં દર્શાવેલ વ્યૂહરચનાઓ અને શ્રેષ્ઠ પદ્ધતિઓનું પાલન કરીને, તમે જટિલ સિસ્ટમને કાબૂમાં લઈ શકો છો અને તમારી લેગસી સિસ્ટમોને જાળવવા યોગ્ય, વિશ્વસનીય અને ઉચ્ચ-પ્રદર્શન સંપત્તિમાં રૂપાંતરિત કરી શકો છો. રિફેક્ટરિંગને વ્યવસ્થિત રીતે અપનાવવાનું, વારંવાર ટેસ્ટ કરવાનું અને તમારી ટીમ સાથે અસરકારક રીતે વાતચીત કરવાનું યાદ રાખો. સાવચેતીભર્યું આયોજન અને અમલીકરણ સાથે, તમે તમારા લેગસી કોડમાં છુપાયેલી સંભવિતતાને અનલોક કરી શકો છો અને ભવિષ્યની નવીનતા માટે માર્ગ મોકળો કરી શકો છો.