рд╡рд╕реНрддреБ рдЙрдиреНрдореБрдЦ рд╕реА

рдЖрдкрдХреЛ рд╕реА рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреВрд▓ рдЧрдП рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд╛рда рдореЗрдВ рдПрдХ рднреА рд╢рдмреНрдж рд╡рд░реНрдЧ рдпрд╛ рдЖрднрд╛рд╕реА рдирд╣реАрдВ рд╣реИ? рдпрд╛ рд╢рд╛рдпрдж рдЖрдк рдПрдПрдирдПрд╕рдЖрдИ рд╕реА рдХреА рд╕рд╛рджрдЧреА рдФрд░ рдХрдареЛрд░рддрд╛ рдХреЗ рд╕рд╛рде рдкреНрдпрд╛рд░ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдк рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдЧреБрдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕реА рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдирдЬрд░рд┐рдП рд╕реЗ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ? рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд░рд▓ рдЪрд╛рд▓реЗрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рднреА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдордХреНрдЦреА рдкрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
C ++ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

class compressor { public: virtual void compress(void* data)=0; virtual void uncompress(void* data)=0; virtual void status()const=0; }; class rar_compressor : public compressor {...}; class zip_compressor : public compressor {...}; void do_compress(compressor* c, void* in_data, void* out_data) { c->compress(in_data); c->uncompress(out_data); c->status(); } 


рдпрд╛ рддреЛ:

 template<typename Cmp> void do_compress(Cmp& c, void* in_data, void* out_data) { c.compress(in_data); c.uncompress(out_data); c.status(); } 

рдЖрдЗрдП рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рд╕реА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

 #compressor_interface.h typedef struct compressor_t { // `public` interface void (*compress)(struct compressor_t*, void* data); void (*uncompress)(struct compressor_t*, void* data); void (*status)(struct compressor_t*); // `private` part void* impl_; } compressor_t; 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЦреБрд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг
`impl_` рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖред
рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ "рдХрдХреНрд╖рд╛рдПрдВ" рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
 #rar.h void rar_init(compressor_t* c, int cr); void rar_free(compressor_t* c); 


 #rar.c typedef struct { int compressed_ratio; int error; int time_to_finish; } rar_impl_t; //////////////////////////////////////////////////////////////////////////////// //      #define PREPARE_IMPL(c) \ assert(c); \ assert(c->impl_); \ rar_impl_t* impl = (rar_impl_t*)c->impl_; //////////////////////////////////////////////////////////////////////////////// static void compress(compressor_t* c, void* data) { PREPARE_IMPL(c) printf("RAR: compressor working. Compressed ratio: %d\n", impl->compressed_ratio); } //////////////////////////////////////////////////////////////////////////////// static void uncompress(compressor_t* c, void* data) { PREPARE_IMPL(c) printf("RAR: uncompressor working. Will be finished in %d.\n", impl->time_to_finish); } //////////////////////////////////////////////////////////////////////////////// static void status(compressor_t* c) { PREPARE_IMPL(c) printf("Compressed ratio: %d, error: %d\n", impl->compressed_ratio, impl->error); } //////////////////////////////////////////////////////////////////////////////// //  void rar_init(compressor_t* c, int cr) { assert(c); c->impl_ = malloc(sizeof(rar_impl_t)); rar_impl_t* impl = (rar_impl_t*)c->impl_; //  `private`  impl->time_to_finish = 5; impl->compressed_ratio = cr; impl->error = 0; //  `public`  c->compress = &compress; c->uncompress = &uncompress; c->status = &status; } //////////////////////////////////////////////////////////////////////////////// // void rar_free(compressor_t* c) { PREPARE_IMPL(c) free(impl); } 


"рдХреНрд▓рд╛рд╕" рдЬрд╝рд┐рдк рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╡рд╣ рд╣реИ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ "рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕", рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ "рд╡рд░реНрдЧ" рдХреЗ рд▓рд┐рдП рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЕрдм рдЙрдкрдпреЛрдЧ рдХреЛрдб:

 void work(compressor_t* c, void* data_to_compress, void* data_to_decompress) { c->compress(c, data_to_compress); c->uncompress(c, data_to_decompress); c->status(c); } int main() { void* uncompressed_data[DATA_SIZE]; void* compressed_data[DATA_SIZE]; compressor_t rar; rar_init(&rar, COMP_RATIO); work(&rar, uncompressed_data, compressed_data); rar_free(&rar); printf("\n"); compressor_t zip; zip_init(&zip, VOLUMES); work(&zip, uncompressed_data, compressed_data); zip_free(&zip); return 0; } 


рдПрдХ рдХрд╕реМрдЯреА рдкрд╛рдардХ рдиреЗ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдПрдХ рджреВрд╕рд░рд╛ рдХрдВрдкреНрд░реЗрд╕рд░_рдЯ рдЬрд┐рдк рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдЖрд░рдПрдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ, рддреЛ рд╣рдо рдордХреНрдЦреА рдкрд░ рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдпреЛрдЬрдирд╛ рдХреЛ рд╢рд╛рд╕реНрддреНрд░реАрдп рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдЧрднрдЧ рдХреНрд▓рд╛рд╕рд┐рдХ рд╣реИ
"рд░рдгрдиреАрддрд┐" рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╣рдордиреЗ OOP рдХреЗ рддреАрди рдореЗрдВ рд╕реЗ рджреЛ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ (рдХреНрдпрд╛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рджрд┐рд▓ рд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ?) рдмрдЪреА рд╣реБрдИ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рд╡рд┐рд░рд╛рд╕рдд рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдпрд╣рд╛рдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдирд╛рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬреАрд╕реАрд╕реА рдореЗрдВ, рдЖрдкрдХреЛ рдзреНрд╡рдЬ "-std = c11" рдпрд╛ "-fms- рдПрдХреНрд╕рдЯреЗрдВрд╢рди") рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЬрд┐рдк рдХрдВрдкреНрд░реЗрд╢рд░ рд╕реЗ рдПрдХ "рд╡рд░реНрдЧ", "рд╡рд┐рд░рд╛рд╕рдд" рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 typedef struct logging_compressor_t { union { struct compressor_t; struct compressor_t base; }; void (*log)(struct logging_compressor_t* lc); void *impl_; //   } logging_compressor_t; 


рдЕрдм рд╣рдо "рдмреЗрд╕" "рдХреНрд▓рд╛рд╕" рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 logging_compressor_t lc; lc.compress(...) 

рддреЛ рдбреЗрдЯрд╛ рд╕рджрд╕реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
 lc.base.compress(...) 


рдЗрд╕ "рд╡рд░реНрдЧ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ рдмрд╣реБрд░реВрдкреА рд╣реИ рдЬреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ

 work(&lc.base, uncompressed_data, compressed_data); 


рдмреЗрд╢рдХ, рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрд╛рдардХ рдЖрдкрддреНрддрд┐ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕рдЯреАрдХрддрд╛ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд░рд╛рд░ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗ рд▓рд┐рдП "рд╡рд┐рдзреНрд╡рдВрд╕рдХ" рдЬрд╝рд┐рдк рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдмрд░реНрдмрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рдЕрдиреНрдп рдмрдХрд╡рд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реА-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рдирд╛ рдерд╛ рдХрд┐ рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдХреВрд▓рд░" рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕реА рдореЗрдВ рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБред

Source: https://habr.com/ru/post/In205570/


All Articles