рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕: рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреНрдпрд╛?

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

рд▓реЗрдХрд┐рди рдорд╛рдорд▓рд╛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдХреНрдпреЛрдВ рд╣реИ? рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ:
const int secondsPerDay = 24*60*60; 

рд╣рдордиреЗ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдкрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдХреЛрдб рдкрдврд╝рддреЗ рд╕рдордп рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдП рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреИрд╕реЗ рдЧрд┐рдирд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╛ рд╢рд╛рдпрдж рдпрд╣ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рде рдореЗрдВ рдирд╣реАрдВ рдерд╛)ред рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рд╕рдВрдХрд▓рдХ рдХреЛ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рд╕рдорд╛рдкреНрдд рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХрд▓рдХ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛ред

рд╣рдо рд╡рд┐рдЬреНрдЮрд╛рди рдХрдерд╛ (рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдФрд░ C ++ рдореЗрдВ рджреЛрдиреЛрдВ) рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рд╣рдордиреЗ рдордВрдЧрд▓ рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:
 enum Planet{ Earth, Mars } const Planet locale = Mars; int secondsPerDay() { if(locale == Earth) { return 24*60*60; } if(locale == Mars) { return 24*60*60+37*60+23; } assert(false, "unknown locale"); } 


SecondsPerDay () рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реИред рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рдФрд░ рдХреЙрд▓ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо рд╢реБрдХреНрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕реЗрдХрдВрдб рдлрд┐рдХреНрд╕ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ (), рддреЛ рдЬрдм рд▓реЛрдХреЗрд▓ = рд╡реАрдирд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрднрд┐рдХрд░реНрддрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдЬрдм рд╕рдВрдХрд▓рди, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЬреАрд╡рди рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ)ред

рд╕реА рдХреЗ рдмрд╛рдж рд╕реЗ рдЬреНрдЮрд╛рдд рдЫрджреНрдо-рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ () рдХреЛ рдпрд╛рдж рдХрд░реЗрдВред рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рд░рди рдЯрд╛рдЗрдо рдкрд░, рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ SQL рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:

 //  -  ,      //    -   T fetchById<T>(Connection conn, int id){ //  !!! assert(is_struct(T), name_of(T)+" is not struct"); assert(has_field(T, id), name_of(T)+ " doesn't contains field id"); string query = "SELECT "; //  !      foreach (field f in T) { if(field.index != 0) { query += ", "; } query += field.name; } query += "FROM " + name_of(T) + " WHERE ID=?ID"; //       ...................................................................................................................... //       Record r,         //   C++     Java?    T result = new T; //            foreach (field f in T) { result[f] = r.getFieldValue<f.type>(f.name); } return result; } 


рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рд╕реНрдерд┐рд░ рд╣реИрдВ, рдФрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдкреВрд░реЗ рдЪрдХреНрд░реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдпреЛрдВ рдпрд╛ рдмрдпрд╛рдиреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдпрд╣ рдордд рдХрд╣реЛ рдХрд┐ RTTI рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдпрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛! RTTI рд░рди рдЯрд╛рдЗрдо рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░рдВрддрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдпрд╣ рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╕реНрдерд┐рд░ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

C # рдФрд░ VB.NET рдореЗрдВ рдирд┐рд░реНрдорд┐рдд, LINQ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХрд╛рдиреВрдиреА рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рд▓рдВрдмреЛрджрд░ рднрд╛рд╡, рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдСрдкрд░реЗрдЯрд░ рд░реВрдкред рд▓реЗрдХрд┐рди Microsoft рдиреЗ рдЯреЗрдмрд▓ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝реАрд▓реНрдб [1] рдХреЗ рд╕рд╛рде рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреА рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП "рд╕реАрдПрд▓рдЖрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реНрдХреАрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдПрдХреАрдХрд░рдг" рдирд╛рдордХ рдЖрдард╡реЗрдВ рд╕реНрддрд░ рдХреЗ рдЬрд╛рджреВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣рд╛рд╕реНрдХреЗрд▓рдмреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА [2,3] рд╣реИред рдЦреБрдж рд╣рд╛рд╕реНрдХреЗрд▓, рдЕрдкрдиреЗ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рдердо-рд╕реНрддрд░реАрдп рдЬрд╛рджреВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ "рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдЯреНрд░реЗрдХреНрд╕ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕" рдирд╛рдордХ рдПрдХ рдХрд╕реНрдЯрдо рднрд╛рд╖рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рдЬрд╛рджреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдШреЛрд╖рдгрд╛ рджреЗрдиреА рд╣реЛрдЧреАред рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
students :: Table(name :: String, mark :: Char)
name :: r\name =>
Attr (name :: String | r) String
mark :: r\mark =>
Attr (mark :: Char | r) Char


рд╣рдорд╛рд░реЗ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВ:
 struct Order{ Date date; Client client; Product product; int qty; Numeric cost; }; struct Sales{ Product product; int qty; Numeric cost; }; 


рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╣рдордиреЗ рдСрд░реНрдбрд░ рдЯреВ рд╕реЗрд▓реНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛
 void foo(Order o, Sales s){ foreach(field f in Sales){ s[f.name] = o[f.name]; } } 


рдЕрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдлреВ () рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдирдИ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ! рдФрд░ рдЕрдЧрд░ рдлрд╝реАрд▓реНрдб рдмреЗрдореЗрд▓ рдХреЗ рдХрд╛рд░рдг рдлреВ () рдХреА рдЧрдгрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 class Shape{ .............................. }; class Square: public Shape{ public: Square(); }; class Circle: public Shape{ public: Square(); }; .................................... // ,       //    ,   //     Shape* shapeFactory(string shapeName) { foreach(type T in descendants(Shape)){ if(name_of(T) == shapeName){ return new T; } return null; } 


рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, рдЖрдХреГрддрд┐ рдирд┐рд░реНрдорд╛рдг () рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:

 Shape* shapeFactory(string shapeName) { if("Square" == shapeName){ return new Square; } if("Circle" == shapeName){ return new Circle; } return null; } 


рд╕рдВрджрд░реНрдн:
1. LINQ: .NET рднрд╛рд╖рд╛-рдПрдХреАрдХреГрдд рдХреНрд╡реЗрд░реА
2. рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╣рд╛рд╕реНрдХреЗрд▓рдмреАрдбреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ
3. рдбреИрди рд▓реАрдЬреЗрди, рдПрд░рд┐рдХ рдореАрдЬрд░ред рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдВрдмреЗрдбреЗрдб рдХрдореНрдкрд╛рдЗрд▓рд░ред рдПрдХ рд▓реЗрдЦ рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓рдмреАрдбреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрд╕рдХреНрдпреВрдПрд▓ рдФрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рдЬреЛрдбрд╝реА рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред

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


All Articles