Рекомендации
 ýòîé ÷añòè áûëè ðaññìîòðåíû îáúåêòíî-îðèåíòèðîâaííûå âîçìîæíîñòè яçûêa C++, è òåïåðü ïðèøëî âðåìя îñòaíîâèòüñя ía ïðîáëåìaõ, êîòîðûå âîçíèêaþò â ïðîöåññå íaïèñaíèя ïðîãðaìì: êaêèå ñðåäñòâa яçûêa ïðåäïî÷òèòåëüíåå âûáèðaòü â ðaçíûõ ñëó÷aяõ, ía ÷òî îáðaòèòü îñîáîå âíèìaíèå, ÷åãî íóæíî èçáåãaòü, ÷òîáû ïðîãðaììa ïîëó÷èëañü ýôôåêòèâíîé è ëåãêî ñîïðîâîæäaåìîé.
Îäíîçía÷íûå ðåêîìåíäaöèè, êaê âñåãäa, äaòü íåâîçìîæíî — òîëüêî ïîíèìaíèå ìåõaíèçìa ðaáîòû C++ ïîçâîëèò ãðaìîòíî åãî èñïîëüçîâaòü.
Cîçäaíèå ëþáîãî ïðîãðaììíîãî ïðîäóêòa ía÷èíaåòñя ñ ïðîöåñña ïðîåêòèðîâa- íèя, è îäía èç ïåðâûõ çaäa÷, âîçíèêaþùèõ ïðè ýòîì, — îïðåäåëèòü, äîëæía ïðî- ãðaììa áûòü îáúåêòíî-îðèåíòèðîâaííîé èëè íåò. Îáúåêòíî-îðèåíòèðîâaííîå ïðîãðaììèðîâaíèå, ïðèìåíåííîå ê çaäa÷å, â êîòîðîé â íåì íåò íåîáõîäèìîñòè, òîëüêî óâåëè÷èò îáúåì ïðîãðaììû è ñëîæíîñòü åå íaïèñaíèя. Åñëè â ïðîöåññå aíaëèça ïîñòaíîâêè çaäa÷è âûяñíяåòñя, ÷òî íåîáõîäèìîñòè â èåðaðõèè êëaññîâ íåò, ÷aùå âñåãî ìîæíî îáîéòèñü ñòðóêòóðíûì ïîäõîäîì. Á. Còðaóñòðóï ñ÷èòaåò,
÷òî «âåçäå, ãäå íå íóæíî áîëåå îäíîãî îáúåêòa îïðåäåëåííîãî òèïa, äîñòaòî÷íî ñòèëя ïðîãðaììèðîâaíèя ñ ñîêðûòèåì äaííûõ ïðè ïîìîùè ìîäóëåé».
Cìåøèâaòü äâa ïîäõîäa â îäíîì ïðîåêòå íå ðåêîìåíäóåòñя, ïîñêîëüêó ìîæåò îêaçaòüñя, ÷òî ãîòîâûé ïðîäóêò îáëaäaåò íåäîñòaòêaìè è ñòðóêòóðíîãî, è îáúåêò- íî-îðèåíòèðîâaííîãî ïðèíöèïîâ ïîñòðîåíèя.
Òåõíîëîãèè ïðîåêòèðîâaíèя ïðîãðaìì ïîñâяùåíî ìíîãî ëèòåðaòóðû, è îñâåùåíèå ýòîãî âîïðîña íå âõîäèò â çaäa÷ó äaííîé êíèãè. Òåì, êòî ñîáèðaåòñя ïðèíèìaòüñя ça ñåðüåçíûå ïðîãðaììíûå ïðîåêòû, ðåêîìåíäóåòñя ïðåäâaðèòåëüíî èçó÷èòü ñòaâ- øèå êëaññè÷åñêèìè êíèãè Ô. Áðóêña [6], Ã. Áó÷a [7] è Á. Còðaóñòðóïa [17]. Äaëåå ðaññìaòðèâaþòñя âîïðîñû, ía êîòîðûå ñëåäóåò îáðaùaòü âíèìaíèå ía ñëåäóþùåì ýòaïå ñîçäaíèя ïðîãðaììû — â ïðîöåññå íaïèñaíèя ïðîãðaììíîãî êîäa.
Ïðè ñîçäaíèè nëañña, òî åñòü íîâîãî òèïa äaííûõ, ñëåäóåò õîðîøî ïðîäóìaòü åãî èíòåðôåññ — ñðåäñòâa ðaáîòû ñ êëaññîì, äîñòóïíûå èñïîëüçóþùèì åãî ïðîãðaì- ìèñòaì. Èíòåðôåéñ õîðîøî ñïðîåêòèðîâaííîãî êëañña èíòóèòèâíî яñåí, íåïðî-
òèâîðå÷èâ è îáîçðèì. Êaê ïðaâèëî, îí äîëæåí âêëþ÷aòü òîëüêî ìåòîäû, íî íå ïîëя äaííûõ. Ïîëя äaííûõ äîëæíû áûòü ñêðûòûìè (private). Ýòî äaåò âîçìîæ- íîñòü âïîñëåäñòâèè èçìåíèòü ðåaëèçaöèþ êëañña áåç èçìåíåíèé â åãî èíòåðôåé- ñå, a òaêæå ðåãóëèðîâaòü äîñòóï ê ïîëяì êëañña ñ ïîìîùüþ íaáîða ïðåäîñòaâëяå- ìûõ ïîëüçîâaòåëþ ìåòîäîâ.
Íå ñëåäóåò îïðåäåëяòü ìåòîäû òèïa get/set äëя âñåõ ñnðûòûõ ïîëåñ nëañña — ýòî âñå ðaâíî, ÷òî îòêðûòü ê íèì äîñòóï, òîëüêî áîëåå ñëîæíûì ñïîñîáîì. Âaæíî ïîìíèòü, ÷òî ïîëя êëañña ââîäяòñя òîëüêî äëя òîãî, ÷òîáû ðåaëèçîâaòü ñâîéñòâa êëañña, ïðåäñòaâëåííûå â åãî èíòåðôåéñå ñ ïîìîùüþ ìåòîäîâ. Êîíå÷íî, íåò íè÷å- ãî ïëîõîãî â òîì, ÷òîáû óñòaíîâèòü èëè ïîëó÷èòü çía÷åíèå íåêîòîðîãî ïîëя ñ ïî- ìîùüþ ìåòîäa, åñëè òaêèì îáðaçîì ðåaëèçóåòñя ñâîéñòâî êëañña (òaêèì îáðaçîì, êîä áóäåò òîò æå, a åãî ñìûñë — ñîâñåì äðóãèì).
Íå íóæíî ðañøèðяòü èíòåðôåéñ êëañña áåç íåîáõîäèìîñòè, «ía âñяêèé ñëó÷aé», ïîñêîëüêó óâåëè÷åíèå êîëè÷åñòâa ìåòîäîâ âåäåò ê òðóäíîñòè ïîíèìaíèя êëañña ïîëüçîâaòåëåì1.  èäåaëå èíòåðôåéñ äîëæåí áûòü ïîëíûì, òî åñòü ïðåäîñòaâëяòü âîçìîæíîñòü âûïîëíèòü ëþáûå ðaçóìíûå äåéñòâèя ñ êëaññîì, è ìèíèìaëüíûì — áåç äóáëèðîâaíèя è ïåðåñå÷åíèя âîçìîæíîñòåé ìåòîäîâ.
 âèäå ìåòîäîâ ðåêîìåíäóåòñя îïðåäåëяòü òîëüêî äåéñòâèя, ðåaëèçóþùèå ñâîé- ñòâa êëañña. Åñëè êaêîå-ëèáî äåéñòâèå ìîæíî ðåaëèçîâaòü, íå îáðaùaяñü ê ñêðû- òûì ïîëяì êëañña, åãî íåò íåîáõîäèìîñòè îïèñûâaòü êaê ìåòîä; ëó÷øå îïèñaòü åãî êaê îáû÷íóþ ôóíêöèþ, ïîìåñòèâ åå â îáùåå ñ êëaññîì ïðîñòðaíñòâî èìåí. Åñëè ôóíêöèя âûïîëíяåò äåéñòâèå, íå яâëяþùååñя ñâîéñòâîì êëañña, íî íóæ- äaåòñя â äîñòóïå ê åãî ñêðûòûì ïîëяì, åå ñëåäóåò îáúяâèòü êaê äðóæåñòâåííóþ. Íî â îáùåì ñëó÷aå äðóxåñòâåííûõ ôóínöèñ è nëaññîâ íaäî èçáåãaòü, ïîñêîëüêó ãëaâíîé èäååé ÎÎÏ яâëяåòñя ìèíèìèçaöèя ñâяçåé ìåæäó èíêaïñóëèðîâaííûìè êëaññaìè.
Äëя óâåëè÷åíèя ïðîèçâîäèòåëüíîñòè ïðîãðaììû íaèáîëåå ÷añòî âûçûâaåìûå ìåòîäû ìîæíî îáúяâèòü êaê âñòðîåííûå (inline).  îñíîâíîì ýòî êañaåòñя êîðîò- êèõ ìåòîäîâ, òåëî êîòîðûõ îêaçûâaåòñя ìåíüøå ðaçìåða êîäa, ãåíåðèðóåìîãî äëя èõ âûçîâa. Êðîìå óñêîðåíèя ïðîãðaììû ça ñ÷åò èñêëþ÷åíèя âûçîâîâ, ýòî äaåò âîçìîæíîñòü êîìïèëяòîðó ïðîèçâîäèòü áîëåå ïîëíóþ îïòèìèçaöèþ. Îäíaêî íå- îáõîäèìî ó÷èòûâaòü, ÷òî äèðåêòèâa inline íîñèò äëя êîìïèëяòîða ðåêîìåíäa- òåëüíûé õaðaêòåð, è îí ìîæåò åé íå ïîñëåäîâaòü — íaïðèìåð, åñëè ìåòîä ñîäåð- æèò ñëîæíûå öèêëû èëè îáúяâëåí êaê âèðòóaëüíûé. Êðîìå òîãî, åñëè ïðîãðaììa èëè êîìïèëяòîð èñïîëüçóþò óêaçaòåëü ía ìåòîä èëè ôóíêöèþ, äîïîëíèòåëüíî áóäåò ñãåíåðèðîâaía èõ íåâñòðaèâaåìaя êîïèя. Åùå îäíèì ñîîáðaæåíèåì, êîòî- ðîå òðåáóåòñя ïðèíèìaòü âî âíèìaíèå, яâëяåòñя òî, ÷òî ìíîãèå îòëaä÷èêè èìåþò ïðîáëåìû ñî âñòðaèâaåìûìè ôóíêöèяìè.
Êîíñòðóêòîðû è äåñòðóêòîðû äåëaòü âñòðaèâaåìûìè íå ðåêîìåíäóåòñя, ïîñêîëü- êó â íèõ ôaêòè÷åñêè ïðèñóòñòâóåò êîä, ïîìåùaåìûé êîìïèëяòîðîì, è ðaçìåð ýòîãî êîäa ìîæåò áûòü âåñüìa çía÷èòåëüíûì (íaïðèìåð, â êîíñòðóêòîðå ïðîèç- âîäíîãî êëañña äîëæíû áûòü âûçâaíû êîíñòðóêòîðû âñåõ áaçîâûõ è âëîæåííûõ êëaññîâ).
1 Ïîä ïîëüçîâaòåëåì èìååòñя â âèäó ïðîãðaììèñò, èñïîëüçóþùèé êëaññ.
Ïåðåãðóæåííûå îïåðaöèè êëañña äîëæíû èìåòü èíòóèòèâíî ïîíяòíûé îáùåïðè- íяòûé ñìûñë (íaïðèìåð, íå ñëåäóåò çañòaâëяòü îïåðaöèþ + âûïîëíяòü ÷òî-ëèáî, êðîìå ñëîæåíèя èëè äîáaâëåíèя).  îñíîâíîì ïåðåãðóçêa îïåðaöèé èñïîëüçóåò- ñя äëя ñîçäaâaåìûõ ïðîãðaììèñòîì aðèôìåòè÷åñêèõ òèïîâ, a â îñòaëüíûõ ñëó÷a- яõ äëя ðåaëèçaöèè êaêèõ-ëèáî äåéñòâèé ñ îáúåêòaìè êëañña ïðåäïî÷òèòåëüíåå èñïîëüçîâaòü ìåòîäû, ïîñêîëüêó èì ìîæíî äaòü îñìûñëåííûå èìåía.
Åñëè êaêaя-ëèáî îïåðaöèя ïåðåãðóæåía, ñëåäóåò, åñëè âîçìîæíî, ïåðåãðóçèòü è aíaëîãè÷íûå îïåðaöèè, íaïðèìåð, +, += è ++ (êîìïèëяòîð ýòîãî aâòîìaòè÷åñêè íå ñäåëaåò). Ïðè ýòîì îïåðaöèè äîëæíû èìåòü òó æå ñåìaíòèêó, ÷òî è èõ ñòaíäaðò- íûå aíaëîãè.
Îñíîâîé ëþáîãî êëañña яâëяþòñя åãî nîíñòðónòîðû è äåñòðónòîðû. Êaê èçâåñò- íî, ïðè îòñóòñòâèè яâíî çaäaííûõ êîíñòðóêòîðîâ, êîíñòðóêòîða êîïèðîâaíèя è îïåðaöèè ïðèñâaèâaíèя êîìïèëяòîð ñîçäaåò èõ aâòîìaòè÷åñnè.
È êîíñòðóêòîð êîïèðîâaíèя, è îïåðaöèя ïðèñâaèâaíèя, ñîçäaâaåìûå ïî óìîë-
÷aíèþ, âûïîëíяþò ïîýëåìåíòíîå êîïèðîâaíèå èç îáëañòè-èñòî÷íèêa â îá- ëañòü-ïðèåìíèê. Åñëè îáúåêò ñîäåðæèò óêaçaòåëè, ýòî ïðèâåäåò ê òîìó, ÷òî ïîñëå êîïèðîâaíèя äâa ñîîòâåòñòâóþùèõ óêaçaòåëя ðaçíûõ îáúåêòîâ áóäóò ññûëaòüñя ía îäíó è òó æå îáëañòü ïaìяòè. Ïðè óíè÷òîæåíèè ïåðâîãî èç îáúåêòîâ ýòa ïa- ìяòü áóäåò îñâîáîæäåía, a ïîâòîðíaя ïîïûòêa îñâîáîäèòü åå ïðè óíè÷òîæåíèè âòîðîãî îáúåêòa ïðèâåäåò ê íåîïðåäåëåííîìó ïîâåäåíèþ ïðîãðaììû. Ïîýòîìó äëя êëaññîâ, ñîäåðæaùèõ ïîëя-óêaçaòåëè, ñëåäóåò âñåãäa яâíî îïðåäåëяòü êîíñò- ðóêòîð êîïèðîâaíèя è îïåðaöèþ ïðèñâaèâaíèя, âûïîëíяþùèå âûäåëåíèå ïaìя- òè ïîä äèíaìè÷åñêèå ïîëя îáúåêòa.
Êðîìå òîãî, äèíaìè÷åñnaя ïaìяòü, âûäåëåííaя â nîíñòðónòîðå îáúånòa, äîëxía îñâîáîxäaòüñя â åãî äåñòðónòîðå. Íåâûïîëíåíèå ýòîãî òðåáîâaíèя ïðèâîäèò ê óòå÷êaì ïaìяòè. Óäaëåíèå íóëåâîãî óêaçaòåëя áåçîïañíî (ïðè ýòîì íè÷åãî íå ïðîèñõîäèò), ïîýòîìó åñëè êîíñòðóêòîðû, êîíñòðóêòîðû êîïèðîâaíèя è îïåða- öèя ïðèñâaèâaíèя íaïèñaíû ïðaâèëüíî, ëþáîé óêaçaòåëü ëèáî ññûëaåòñя ía âû- äåëåííóþ îáëañòü ïaìяòè, ëèáî ðaâåí íóëþ, è ê íåìó ìîæíî ïðèìåíяòü delete áåç ïðîâåðêè.
Ðaçíèöa ìåæäó êîíñòðóêòîðîì êîïèðîâaíèя è îïåðaöèåé ïðèñâaèâaíèя çaêëþ-
÷aåòñя â òîì, ÷òî ïîñëåäíяя ðaáîòaåò â òîì ñëó÷aå, êîãäa îáúåêò-ïðèåìíèê óæå ñóùåñòâóåò, ïîýòîìó â íåé ïåðåä âûäåëåíèåì äèíaìè÷åñêîé ïaìяòè ñëåäóåò îñ- âîáîäèòü çaíяòóþ ðaíåå. Èç ýòîãî ñëåäóåò, ÷òî ïðè ðåaëèçaöèè îïåðaöèè ïðè- ñâaèâaíèя äëя êëaññîâ, ñîäåðæaùèõ ïîëя-óêaçaòåëè, íåîáõîäèìî ïðîâîäèòü ïðî- âåðêó ía ñaìîïðèñâaèâaíèå è â ýòîì ñëó÷aå îñòaâèòü îáúåêò áåç èçìåíåíèé. Íåîáõîäèìî òaêæå ïîìíèòü î òîì, ÷òî îïåðaöèя ïðèñâaèâaíèя äîëæía âîçâða- ùaòü ññûëêó ía êîíñòaíòó. Òaêèì îáðaçîì, îïðåäåëåíèå îïåðaöèè ïðèñâaèâaíèя äîëæíî èìåòü âèä:
Class X{
COnst X & OperatOr=(COnstX& r);
…
};
COnst X & X::OperatOr=(COnstX& r){ if(this != &r){
// Êîïèðîâaíèå
}
return *this;
}
Do'stlaringiz bilan baham: |