Modern C++ Design
મોડર્ન સી + + ડિઝાઇનઃ જેનરિક પ્રોગ્રામિંગ એન્ડ ડિઝાઇન પેટર્ન એપ્લાઇડ એ એન્ડ્રેઈ એલેક્ઝાન્ડ્રેસ્કુ દ્વારા લખાયેલું પુસ્તક છે, જે 2001માં એડિસન-વેસ્લી દ્વારા પ્રકાશિત થયું હતું. તેને સ્કોટ મેયર્સ દ્વારા "સૌથી મહત્વપૂર્ણ સી + + પુસ્તકોમાંનું એક" ગણવામાં આવ્યું છે. આ પુસ્તક ટેમ્પલેટ મેટાપ્રોગ્રામિંગ નામની સી + + પ્રોગ્રામિંગ તકનીકનો ઉપયોગ કરે છે અને તેની શોધ કરે છે. જ્યારે એલેક્ઝાન્ડ્રેસ્કુએ આ તકનીકની શોધ કરી ન હતી, ત્યારે તેમણે તેને પ્રોગ્રામરોમાં લોકપ્રિય બનાવી છે. તેમના પુસ્તકમાં વ્યવહારુ સમસ્યાઓના ઉકેલો છે જેનો સામનો C + + પ્રોગ્રામરો કરી શકે છે. પુસ્તકના કેટલાક શબ્દસમૂહો હવે સી + + સમુદાયમાં સામાન્ય શબ્દો તરીકે ઉપયોગમાં લેવાય છેઃ આધુનિક સી + + (સી/સી + + શૈલીના વિરોધમાં), નીતિ-આધારિત ડિઝાઇન અને ટાઇપલિસ્ટ. પુસ્તકમાં વર્ણવેલ તમામ કોડ તેમની લાઇબ્રેરી લોકીમાં મફતમાં ઉપલબ્ધ છે. આ પુસ્તક 2001 થી ઘણી ભાષાઓમાં ફરીથી પ્રકાશિત અને અનુવાદિત કરવામાં આવ્યું છે. નીતિ-આધારિત ડિઝાઇન નીતિ-આધારિત ડિઝાઇન, જેને નીતિ-આધારિત વર્ગ ડિઝાઇન અથવા નીતિ-આધારિત પ્રોગ્રામિંગ તરીકે પણ ઓળખવામાં આવે છે, તે શબ્દનો ઉપયોગ આધુનિક સી + + ડિઝાઇનમાં નીતિઓ તરીકે ઓળખાતા સી + + માટેના રૂઢિપ્રયોગ પર આધારિત ડિઝાઇન અભિગમ માટે થાય છે. તેને વ્યૂહરચના પેટર્નના સંકલન-સમયના પ્રકાર તરીકે વર્ણવવામાં આવ્યું છે, અને તે C + + નમૂના મેટાપ્રોગ્રામિંગ સાથે જોડાણ ધરાવે છે. તે સૌપ્રથમ C + + માં એન્ડ્રેઈ એલેક્ઝાન્ડ્રેસ્કુ દ્વારા આધુનિક C + + ડિઝાઇન સાથે અને C/C + + વપરાશકર્તાઓ જર્નલમાં તેમના કોલમ જેનરિક <પ્રોગ્રામિંગ> સાથે લોકપ્રિય બનાવવામાં આવ્યું હતું, અને તે હાલમાં C + + અને D સાથે નજીકથી સંકળાયેલું છે કારણ કે તેને નમૂનાઓ માટે અત્યંત મજબૂત સમર્થન સાથે કમ્પાઇલરની જરૂર છે, જે લગભગ 2003 પહેલાં સામાન્ય ન હતું. આ ડિઝાઇન અભિગમના અગાઉના ઉદાહરણોમાં, પરિમાણિત સામાન્ય કોડ પર આધારિત, એમ. એલ. ભાષાઓના પેરામેટ્રિક મોડ્યુલો (ફંકટર) અને મેમરી મેનેજમેન્ટ નીતિ માટે સી + + એલોકેટરનો સમાવેશ થાય છે. નીતિ-આધારિત ડિઝાઇનમાં કેન્દ્રિય રૂઢિપ્રયોગ એ વર્ગ નમૂના (યજમાન વર્ગ તરીકે ઓળખાય છે) છે, જે ઇનપુટ તરીકે વિવિધ પ્રકારના પરિમાણો લે છે, જે વપરાશકર્તા દ્વારા પસંદ કરેલા પ્રકારો (નીતિ વર્ગો તરીકે ઓળખાય છે) સાથે ત્વરિત થાય છે, દરેક ચોક્કસ ગર્ભિત ઇન્ટરફેસને અમલમાં મૂકે છે (જેને નીતિ કહેવાય છે), અને તાત્કાલિક યજમાન વર્ગના વર્તનના કેટલાક ઓર્થોગોનલ (અથવા મોટે ભાગે ઓર્થોગોનલ) પાસાને સમાવિષ્ટ કરે છે. દરેક નીતિ માટે વિવિધ, તૈયાર અમલીકરણના સમૂહ સાથે સંયુક્ત યજમાન વર્ગને પુરવઠો પૂરો પાડીને, પુસ્તકાલય અથવા મોડ્યુલ વિવિધ વર્તણૂક સંયોજનોની ઘાતાંકીય સંખ્યાને ટેકો આપી શકે છે, જે સંકલન સમયે ઉકેલાય છે, અને યજમાન વર્ગ નમૂનાના ત્વરિતમાં વિવિધ પૂરા પાડવામાં આવેલા નીતિ વર્ગોને ભેળવીને અને મેળ કરીને પસંદ કરવામાં આવે છે. વધુમાં, આપેલ નીતિનું કસ્ટમ અમલીકરણ લખીને, લાઇબ્રેરી અમલીકરણકર્તા દ્વારા અણધાર્યા વર્તણૂકોની જરૂર હોય તેવી પરિસ્થિતિઓમાં નીતિ-આધારિત પુસ્તકાલયનો ઉપયોગ કરી શકાય છે. એવા કિસ્સાઓમાં પણ કે જ્યાં દરેક નીતિના એકથી વધુ અમલીકરણનો ક્યારેય ઉપયોગ કરવામાં આવશે નહીં, નીતિઓમાં વર્ગને વિઘટિત કરવાથી ડિઝાઇન પ્રક્રિયામાં મદદ મળી શકે છે, મોડ્યુલારિટી વધારીને અને ઓર્થોગોનલ ડિઝાઇનના નિર્ણયો ક્યાં લેવામાં આવ્યા છે તે બરાબર પ્રકાશિત કરીને. જ્યારે વિનિમયક્ષમ મોડ્યુલોમાંથી સોફ્ટવેર ઘટકોને એસેમ્બલ કરવું એ નવી વિભાવનાથી દૂર છે, ત્યારે નીતિ-આધારિત ડિઝાઇન વ્યક્તિગત વર્ગના વર્તનને વ્યાખ્યાયિત કરવાના (પ્રમાણમાં નીચા) સ્તરે તે વિભાવનાને લાગુ કરવાની રીતમાં નવીનતાને રજૂ કરે છે. પોલિસી વર્ગો કોલબેક સાથે કેટલીક સમાનતા ધરાવે છે, પરંતુ તેમાં તફાવત છે, એક જ કાર્યને બદલે, પોલિસી વર્ગમાં સામાન્ય રીતે અનેક સંબંધિત કાર્યો (પદ્ધતિઓ) હોય છે, જે ઘણીવાર રાજ્ય ચલ અથવા નેસ્ટેડ પ્રકારો જેવી અન્ય સુવિધાઓ સાથે જોડાયેલા હોય છે. નીતિ-આધારિત યજમાન વર્ગને મેટાફંક્શનના એક પ્રકાર તરીકે વિચારી શકાય છે, જેમાં પ્રકારો દ્વારા રજૂ કરાયેલા વર્તણૂકોનો સમૂહ ઇનપુટ તરીકે લઈ શકાય છે, અને આઉટપુટ તરીકે પરત કરી શકાય છે, જે તે વર્તણૂકોને કાર્યશીલ સંપૂર્ણતામાં જોડવાના પરિણામનું પ્રતિનિધિત્વ કરે છે. (એમ. પી. એલ. મેટાફંક્શન્સથી વિપરીત, જોકે, આઉટપુટ સામાન્ય રીતે નેસ્ટેડ આઉટપુટ પ્રકારને બદલે તાત્કાલિક યજમાન વર્ગ દ્વારા જ રજૂ થાય છે.) નીતિની રૂઢિપ્રયોગની મુખ્ય લાક્ષણિકતા એ છે કે, સામાન્ય રીતે (જોકે તે સખત રીતે જરૂરી નથી), યજમાન વર્ગ (જાહેર) બહુવિધ વારસાનો ઉપયોગ કરીને તેના દરેક નીતિ વર્ગોમાંથી (પોતાને બાળ વર્ગ બનાવશે) મેળવશે. (વૈકલ્પિક વિકલ્પો યજમાન વર્ગ માટે માત્ર દરેક નીતિ વર્ગ પ્રકારનાં સભ્ય ચલને સમાવવા માટે હોય છે, અથવા અન્યથા નીતિ વર્ગોને ખાનગી રીતે વારસામાં લેવા માટે હોય છે; જો કે નીતિ વર્ગોને જાહેરમાં વારસામાં લેવાનો મોટો ફાયદો એ છે કે નીતિ વર્ગ નવી પદ્ધતિઓ ઉમેરી શકે છે, જે તાત્કાલિક યજમાન વર્ગ દ્વારા વારસામાં મળી છે અને તેના વપરાશકર્તાઓ માટે સુલભ છે, જેના વિશે યજમાન વર્ગને જાણવાની પણ જરૂર નથી.) નીતિના રૂઢિપ્રયોગના આ પાસાનું એક નોંધપાત્ર લક્ષણ એ છે કે, ઓબ્જેક્ટ-ઓરિએન્ટેડ પ્રોગ્રામિંગના સંબંધમાં, નીતિઓ બેઝ ક્લાસ અને ડેરિવેટેડ ક્લાસ વચ્ચેના સંબંધને ઉલટાવી દે છે-જ્યારે કે ઓ. ઓ. પી. ઇન્ટરફેસમાં પરંપરાગત રીતે (અમૂર્ત) બેઝ ક્લાસ અને ડેરિવેટેડ ક્લાસ દ્વારા ઇન્ટરફેસના અમલીકરણ દ્વારા રજૂ કરવામાં આવે છે, નીતિ-આધારિત ડિઝાઇનમાં ડેરિવેટેડ (હોસ્ટ) ક્લાસ ઇન્ટરફેસનું પ્રતિનિધિત્વ કરે છે અને બેઝ (પોલિસી) ક્લાસ તેમને અમલમાં મૂકે છે. નીતિઓના કિસ્સામાં, જાહેર વારસો યજમાન અને નીતિ વર્ગો વચ્ચેના સંબંધને રજૂ કરતું નથી. જ્યારે આને પરંપરાગત રીતે ઓ. ઓ. પી. સંદર્ભમાં ડિઝાઇનની ખામીનો પુરાવો માનવામાં આવશે, ત્યારે આ નીતિના રૂઢિપ્રયોગના સંદર્ભમાં લાગુ પડતું નથી. તેમના વર્તમાન અવતારમાં નીતિઓનો ગેરલાભ એ છે કે નીતિ ઇન્ટરફેસમાં કોડમાં સીધી, સ્પષ્ટ રજૂઆત નથી, પરંતુ તેને ડક ટાઇપિંગ દ્વારા સ્પષ્ટ રીતે વ્યાખ્યાયિત કરવામાં આવે છે, અને ટિપ્પણીઓમાં અલગ અને જાતે દસ્તાવેજીકરણ કરવું આવશ્યક છે. મુખ્ય વિચાર એ છે કે પ્રકારને નિશ્ચિત અમલીકરણ અને ઇન્ટરફેસ, નીતિ-આધારિત વર્ગ અને વિવિધ નીતિઓમાં વિભાજિત કરવા માટે સમાનતા-પરિવર્તનશીલતા વિશ્લેષણનો ઉપયોગ કરવો. મુખ્ય વર્ગમાં શું જાય છે અને કઈ નીતિઓ બનાવવી જોઈએ તે જાણવાની યુક્તિ છે. ઉપર ઉલ્લેખિત લેખ નીચેનો જવાબ આપે છેઃ જ્યાં પણ આપણે સંભવિત મર્યાદિત ડિઝાઇન નિર્ણય લેવાની જરૂર પડશે, આપણે તે નિર્ણયને મુલતવી રાખવો જોઈએ, આપણે તેને યોગ્ય નામવાળી નીતિને સોંપવો જોઈએ. નીતિના વર્ગોમાં અમલીકરણ, પ્રકારની વ્યાખ્યાઓ વગેરે હોઈ શકે છે. મૂળભૂત રીતે, મુખ્ય નમૂના વર્ગના ડિઝાઇનર નિર્ધારિત કરશે કે નીતિ વર્ગોએ શું પ્રદાન કરવું જોઈએ, તેમને કયા કસ્ટમાઇઝેશન બિંદુઓને અમલમાં મૂકવાની જરૂર છે. નીતિઓનો સારો સમૂહ બનાવવો એક નાજુક કાર્ય હોઈ શકે છે, માત્ર યોગ્ય સંખ્યા (દા. ત., ઓછામાં ઓછી જરૂરી). વિવિધ કસ્ટમાઇઝેશન બિંદુઓ, જે એકસાથે સંબંધિત છે, તે એક નીતિ દલીલમાં જવા જોઈએ, જેમ કે સંગ્રહ નીતિ, માન્યતા નીતિ અને તેથી આગળ. ગ્રાફિક ડિઝાઇનરો તેમની નીતિઓને નામ આપવા સક્ષમ હોય છે, જે વિભાવનાઓનું પ્રતિનિધિત્વ કરે છે, અને તે નહીં કે જે કામગીરી અથવા નાના અમલીકરણ વિગતોનું પ્રતિનિધિત્વ કરે છે. નીતિ-આધારિત ડિઝાઇનમાં અન્ય ઉપયોગી તકનીકોનો સમાવેશ થઈ શકે છે. ઉદાહરણ તરીકે, સંકલન સમય માટે ટેમ્પલેટ પદ્ધતિ પેટર્નનું પુનઃઅર્થઘટન કરી શકાય છે, જેથી મુખ્ય વર્ગમાં હાડપિંજર અલ્ગોરિધમ હોય, જે કસ્ટમાઇઝેશન પોઇન્ટસ્કોલ પર કેટલીક નીતિઓના યોગ્ય કાર્યોને નિર્દેશ કરે છે. આ C + + ના ભાવિ સંસ્કરણોમાં વિભાવનાઓ દ્વારા ગતિશીલ રીતે પ્રાપ્ત કરવામાં આવશે. નીચે પ્રસ્તુત કરેલું સરળ ઉદાહરણ સી + + હેલો વર્લ્ડ પ્રોગ્રામનું એક સરળ (કૃત્રિમ) ઉદાહરણ છે, જ્યાં છાપવાના લખાણ અને તેને છાપવાની પદ્ધતિ નીતિઓનો ઉપયોગ કરીને વિઘટિત થાય છે. આ ઉદાહરણમાં, હેલોવર્લ્ડ એક યજમાન વર્ગ છે જ્યાં તે બે નીતિઓ લે છે, એક સંદેશ કેવી રીતે બતાવવો જોઈએ તે સ્પષ્ટ કરવા માટે અને બીજો વાસ્તવિક સંદેશ છાપવા માટે. નોંધ લો કે સામાન્ય અમલીકરણ રનમાં છે અને તેથી જ્યાં સુધી બંને નીતિઓ (પ્રિન્ટ અને મેસેજ) પૂરી પાડવામાં ન આવે ત્યાં સુધી કોડ સંકલિત કરવામાં અસમર્થ છે. #include <iostોટ્રીમ> #include <શબ્દમાળા> નમૂના <ટંકણનામ આઉટપુટ પોલિસી, ટંકણનામ લેંગ્વેજ પોલિસી> વર્ગ હેલોવર્લ્ડઃ ખાનગી આઉટપુટ પોલિસી, ખાનગી લેંગ્વેજ પોલિસી {સાર્વજનિકઃ// વર્તણૂક પદ્ધતિ. શૂન્ય રન () કોન્સ્ટ {// બે નીતિ પદ્ધતિઓ. પ્રિન્ટ કરો (સંદેશ ());} ખાનગીઃ લેંગ્વેજ પોલિસીનો ઉપયોગ કરીનેઃ: સંદેશ; આઉટપુટ પોલિસીનો ઉપયોગ કરીનેઃ: પ્રિન્ટ;}; વર્ગ આઉટપુટ પોલિસીરાઈટ ટૂકાઉટ {સંરક્ષિતઃ નમૂના <ટંકણનામ સંદેશ પ્રકાર> રદબાતલ પ્રિન્ટ (સંદેશ પ્રકાર & & સંદેશ) કોન્સ્ટ {એસટીડીઃ: કાઉટ <<સંદેશ <<એસટીડીઃ: એન્ડએલ;}; વર્ગ લેંગ્વેજ પોલિસી ઇંગ્લિશ {સંરક્ષિતઃ એસટીડીઃ: સ્ટ્રિંગ મેસેજ () કોન્સ્ટ {રીટર્ન "હેલો, વર્લ્ડ! ";}}; વર્ગ લેંગ્વેજ પોલિસીજર્મન {સંરક્ષિતઃ std:: શબ્દમાળા સંદેશ () કોન્સ્ટ {રીટર્ન" હેલો વેલ્ટ! ";}}; ઇન્ટ મેઇન () {// ઉદાહરણ 1 નો ઉપયોગ કરીને હેલોવર્લ્ડઇંગ્લિશ = હેલોવર્લ્ડ <આઉટપુટપોલિસીરાઈટ ટૂકાઉટ, લેંગ્વેજપોલિસીઇંગ્લિશ>; હેલોવર્લ્ડઇંગ્લિશ હેલો _ વર્લ્ડ; hello_world.Run ();// પ્રિન્ટ" હેલો, વર્લ્ડ! " //ઉદાહરણ 2// એ જ કરે છે, પરંતુ અન્ય ભાષા નીતિનો ઉપયોગ કરે છે. હેલોવર્લ્ડગર્મન = હેલોવર્લ્ડ <આઉટપુટપોલીસીરાઈટ ટૂકાઉટ, લેંગ્વેજપોલીસીગર્મન> નો ઉપયોગ કરીને; હેલોવર્લ્ડગર્મન હેલો _ વર્લ્ડ2; hello_world2.Run ();// પ્રિન્ટ "હેલો વેલ્ટ!". ડિઝાઇનર્સ સરળતાથી મેમ્બર ફંક્શન પ્રિન્ટ સાથે નવા વર્ગો ઉમેરીને વધુ આઉટપુટ પોલિસી લખી શકે છે અને તેને નવી આઉટપુટ પોલિસી તરીકે લઈ શકે છે. લોકી લાઈબ્રેરી એ એન્ડ્રેઈ એલેક્ઝાન્ડ્રેસ્કુ દ્વારા તેમના પુસ્તક મોડર્ન સી + + ડિઝાઇનના ભાગ રૂપે લખાયેલી સી + + સોફ્ટવેર લાઈબ્રેરીનું નામ છે. લાઇબ્રેરી સી + + નમૂના મેટાપ્રોગ્રામિંગનો વ્યાપક ઉપયોગ કરે છે અને કેટલાક સામાન્ય રીતે ઉપયોગમાં લેવાતા સાધનોનો અમલ કરે છેઃ ટાઇપલિસ્ટ, ફંકટર, સિંગલટન, સ્માર્ટ પોઇન્ટર, ઓબ્જેક્ટ ફેક્ટરી, મુલાકાતી અને મલ્ટીમેથોડ્સ. મૂળરૂપે આ પુસ્તકાલય માત્ર બે સૌથી પ્રમાણભૂત અનુરૂપ C + + કમ્પાઇલર્સ (કોડ વોરિયર અને કોમો C/C + +) સાથે સુસંગત હતુંઃ પછીના પ્રયત્નોએ તેને કમ્પાઇલર્સની વિશાળ શ્રેણી (જૂના વિઝ્યુઅલ C + + 6.0, બોરલેન્ડ C + + બિલ્ડર 6.0, ક્લાંગ અને GCC સહિત) સાથે ઉપયોગી બનાવ્યું છે. કમ્પાઇલર વિક્રેતાઓએ લોકીનો ઉપયોગ સુસંગતતાના માપદંડ તરીકે કર્યો હતો, જેનાથી સુસંગત કમ્પાઇલરની સંખ્યામાં વધુ વધારો થયો હતો. સોર્સફોર્જ પ્રોજેક્ટ તરીકે પીટર કુમેલ અને રિચાર્ડ સ્પોસાટોની આગેવાની હેઠળના ઓપન-સોર્સ સમુદાય દ્વારા લોકીની જાળવણી અને વધુ વિકાસ ચાલુ રાખવામાં આવ્યો છે. ઘણા લોકો દ્વારા ચાલુ યોગદાનથી પુસ્તકાલયની એકંદર મજબૂતાઈ અને કાર્યક્ષમતામાં સુધારો થયો છે. લોકી હવે પુસ્તક સાથે બંધાયેલ નથી કારણ કે તેમાં પહેલેથી જ ઘણા નવા ઘટકો છે (દા. ત. સ્ટ્રોંગપીટીઆર, પ્રિન્ટએફ અને સ્કોપગાર્ડ). લોકીએ પ્રેરિત સમાન સાધનો અને કાર્યક્ષમતા હવે બૂસ્ટ લાઇબ્રેરી સંગ્રહમાં પણ હાજર છે. બૂસ્ટ (સી + + લાઈબ્રેરીઓ) મિક્સિન સંદર્ભો બાહ્ય લિંક્સ એલેક્ઝાન્ડ્રેસ્કુની વેબસાઇટ (પુસ્તકની ભૂલ સાથે) સ્માર્ટ પોઇંટર્સ (પુસ્તકમાંથી નમૂના પ્રકરણ) પુસ્તક પ્રકાશકનો મૂળ સ્રોત કોડ 2001 બિન-કાલ્પનિક પુસ્તકો સી + + વિશે પુસ્તકો