рд╢рдмреНрдж "рдХрд╛рд░рдЦрд╛рдирд╛" рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреЗ (рдпрд╛ рдЕрдиреНрдп) рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд░реНрде рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдмрд╣реБрд░реВрдкреА рдпрд╛ рдирд╣реАрдВ); рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ (рд╕реНрдерд┐рд░ рдпрд╛ рдирд╣реАрдВ) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреА рд╣реИ; рдпрд╣ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдХрд┐рд╕реА рднреА рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ (
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рд╕рд╣рд┐рдд)ред
рдмреЗрд╢рдХ, рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рд╢рдмреНрдж "рдХрд╛рд░рдЦрд╛рдирд╛" рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╢рдмреНрдж рдХреЗ рддрд╣рдд рдлреЛрд░ рдЖрд░реНрд╕реЗрдирд▓ рдХреЗ рдЧреИрдВрдЧ рд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреЗрдирд░реЗрдЯрд░ рдкреИрдЯрд░реНрди рдХреЛ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ -
"рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб" рдФрд░
"рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдлреИрдХреНрдЯреНрд░реА" , рдЬрд┐рд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдореИрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЙрдирдХреА рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рдордЭ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдЧрд╛ред
рдФрд░ рдореБрдЭреЗ рдпрд╣ рдирд┐рдмрдВрдз
рдЬреЛрд╢реБрдЖ рдХреЗрд░рд┐рд╡реНрд╕реНрдХреА (
"рдФрджреНрдпреЛрдЧрд┐рдХ рддрд░реНрдХ" рдХреЗ рдкреНрд░рдореБрдЦ ) рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рдмрд▓реНрдХрд┐, рдЙрдирдХреА рдкреБрд╕реНрддрдХ
"рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдЯреВ рдкреИрдЯрд░реНрди" , рдЬреЛ рдХрд┐ рд╢рддрд╛рдмреНрджреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ
рдорд╛рд░реНрдЯрд┐рди рдлрд╛рд╡рд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд рдкреБрд╕реНрддрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдИ рдереА (рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреНрд▓рд╛рд╕рд┐рдХ рдХреЗ рдкреНрд░рд╕рд┐рджреНрдз рд▓реЗрдЦрдХ - рдкреБрд╕реНрддрдХ
" рдкреБрд╕реНрддрдХ
" рдкрд░рд╛рд╡рд░реНрддрди " )ред рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ (рдпрд╛ рдореБрдЭреЗ рдмрд╣реБрдд рдХреБрдЫ рдкрддрд╛ рд╣реИ) рдкрдврд╝рд╛ рдпрд╛ рд╕реБрдирд╛ рднреА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдкрдиреА рд░реАрдбрд┐рдВрдЧ рд▓рд┐рд╕реНрдЯ рдореЗрдВ рдЬрд╝рд░реВрд░ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдпрд╣ Refactoring рдФрд░ рдПрдХ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреБрд╕реНрддрдХ,
Objective Design Techniques рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЧреНрдп рдЕрдЧрд▓реА рдХрдбрд╝реА рд╣реИ
ред рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрдирдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ
рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди
"рдЧрдВрдз" рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд░реНрдЬрдиреЛрдВ рд╡реНрдпрдВрдЬрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЪрд░реНрдЪрд╛ рдХреЗ рддрд╣рдд рд╡рд┐рд╖рдп рдкрд░ рддреАрди (рдХрдо рд╕реЗ рдХрдо) "рд╡реНрдпрдВрдЬрдиреЛрдВ" рд╕рд╣рд┐рддред
рд╕рд╛рд░ рдХрд╛рд░рдЦрд╛рдирд╛
рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рдореЗрдВ рдХреЗрд░рд┐рд╡реНрд╕реНрдХреА рдиреЗ рджреЛ рдорд╛рдорд▓реЗ рджрд┐рдП рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдкрд╣рд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ
рдореЗрдВ рдЬреНрдЮрд╛рди рдХрд╛
рдЕрдВрддрд░рд╛рд▓ рд╣реИ ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдпрд╣ рдЬреНрдЮрд╛рди рд╣реЛрдЧрд╛ред рдлреИрдХреНрдЯреНрд░реА рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ
рдПрдкреАрдЖрдИ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ (рд╕реНрдерд┐рд░ рдпрд╛ рдирд╣реАрдВ) рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ "рдмрд╛рдд рдХрд░ рд░рд╣реЗ" рдирд╛рдо рд╣реИрдВ (рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИ (рдФрд░, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдп рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдорд╛рди рдХрдореЛрдмреЗрд╢ рд╣реИрдВ)ред рдпрд╣ рд╡рд╣ рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╣реА рд╕рдореВрд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░рдЦрд╛рдирд╛ рдлрд┐рд░ рд╕реЗ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рдЕрд▓рдЧ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ рдЕрдЧрд░ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред
"IOS" рдХреЗ рддрд╣рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд┐рд╖рдп рдХреЗ рдХрд░реАрдм рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП,
UIViewController
рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рдЖрдИрдУрдПрд╕" рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдпрд╣ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ "рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛" рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╡рд░реНрдЧ рдЕрдХреНрд╕рд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЪрд╛рд░ рдХрд┐рддрд╛рдмреЛрдВ рдХреЗ рдЧреИрдВрдЧ рд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдмрдВрдж рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдХреЛрдб рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордЭ рд╣реА рдЗрд╕рдХреЗ рдЕрдзрд┐рдХ рдореБрдХреНрдд рдЙрдкрдпреЛрдЧ рдХрд╛ рджреНрд╡рд╛рд░ рдЦреЛрд▓рддреА рд╣реИред
рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ рд╡рд╛рд╣рдиреЛрдВ рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рд╣рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рд╣рдиреЛрдВ рдХреЗ рд▓рд┐рдП
UIViewController
рд╡рд┐рднрд┐рдиреНрди рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рд╡рд╛рд╣рди рд░рд╛рдЬреНрдп рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ (рдирдП рдФрд░ рдкреНрд░рдпреБрдХреНрдд):
enum VehicleCondition{ case new case used } final class BicycleViewController: UIViewController { private let condition: VehicleCondition init(condition: VehicleCondition) { self.condition = condition super.init(nibName: nil, bundle: nil) } required init?(coder aDecoder: NSCoder) { fatalError("BicycleViewController: init(coder:) has not been implemented.") } } final class ScooterViewController: UIViewController { private let condition: VehicleCondition init(condition: VehicleCondition) { self.condition = condition super.init(nibName: nil, bundle: nil) } required init?(coder aDecoder: NSCoder) { fatalError("ScooterViewController: init(coder:) has not been implemented.") } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдореВрд╣ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдкрд░рд┐рд╡рд╛рд░ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЙрддреНрдкрд╛рдж рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрдХреВрдЯрд░ рдпрд╛ рд╕рд╛рдЗрдХрд┐рд▓ рд╣реИ, рд╣рдо рдЙрдкрдпреБрдХреНрдд рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБ)ред рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рдпреЗ рджреЛрдиреЛрдВ рддрд░реНрдХ "рдХрд╛рд░рдЦрд╛рдирд╛" рдмрдирд╛рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ рдХрд┐ рдЕрдХреЗрд▓реЗ рд╕рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХрд╛ рдЬреНрдЮрд╛рди рд╣реЛрдЧрд╛?
рдмреЗрд╢рдХ, рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, "рдХрд╛рд░рдЦрд╛рдиреЗ" рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
"рдЕрддрд┐рд╡реНрдпрд╛рдкреА" рд╣реЛрдЧрд╛ ред рдлрд┐рд░ рднреА, рдпрджрд┐ рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рд╣рди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ "рдХрд╛рд░рдЦрд╛рдиреЗ" рдХреЗ рдлрд╛рдпрджреЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рддреЛ, рдЖрдЗрдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ "рдЕрдореВрд░реНрдд рдХрд╛рд░рдЦрд╛рдиреЗ" рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛:
protocol VehicleViewControllerFactory { func makeBicycleViewController() -> UIViewController func makeScooterViewController() -> UIViewController }
(
рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ
рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рдЫреЛрдЯрд╛
"рдбрд┐рдЬрд╝рд╛рдЗрди рдЧрд╛рдЗрдбрд▓рд╛рдЗрди" рд╢рдмреНрдж рдмрдирд╛рдиреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред)
(рдЪрд╛рд░ рдХреЗ рдЧрд┐рд░реЛрд╣ рдХреА рдкреБрд╕реНрддрдХ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг
"C ++" рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣
рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдФрд░
"рдЖрднрд╛рд╕реА" рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред "рд╕реНрд╡рд┐рдлреНрдЯ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рд╣рдорд╛рд░реЗ рдХрд░реАрдм рд╣реИред)
рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдлрд╝реИрдХреНрдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рд╕рд╛рдЗрдХрд┐рд▓ рдФрд░ рд╕реНрдХреВрдЯрд░ рдмреЗрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд┐рдзрд┐рдпрд╛рдБ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреА рд╡рд╛рдкрд╕реА рдХрд░рддреА рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХрд╛ рджрд╛рдпрд░рд╛ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рддрдХ рд╕реАрдорд┐рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
"рдХрдВрдХреНрд░реАрдЯ рдХрд╛рд░рдЦрд╛рдиреЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЕрдореВрд░реНрдд рдХрд╛рд░рдЦрд╛рдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
struct NewVehicleViewControllerFactory: VehicleViewControllerFactory { func makeBicycleViewController() -> UIViewController { return BicycleViewController(condition: .new) } func makeScooterViewController() -> UIViewController { return ScooterViewController(condition: .new) } } struct UsedVehicleViewControllerFactory: VehicleViewControllerFactory { func makeBicycleViewController() -> UIViewController { return BicycleViewController(condition: .used) } func makeScooterViewController() -> UIViewController { return ScooterViewController(condition: .used) } }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдб рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рдирдП рдФрд░ рдЙрдкрдпреЛрдЧ) рдХреЗ рд╡рд╛рд╣рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
рд╕рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛ рдЕрдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
let factory: VehicleViewControllerFactory = NewVehicleViewControllerFactory() let vc = factory.makeBicycleViewController()
рдлреИрдХреНрдЯреНрд░реА рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯрд┐рдВрдЧ рдХреНрд▓рд╛рд╕реЗрд╕
рдЕрдм рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЙрди рдорд╛рдорд▓реЛрдВ рдкрд░ рдЬрд╛рдПрдВ рдЬреЛ рдХрд┐рд░реАрд╡рд╕реНрдХреА рдиреЗ рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рд╣реИрдВред
рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛
рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреЗ
рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╣рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд┐рдпрдВрддреНрд░рдХ рд▓реЗрдВ:
final class BicycleViewController: UIViewController { } final class ScooterViewController: UIViewController { }
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд▓рдЧ-рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдКрдкрд░ рдШреЛрд╖рд┐рдд рдХрдХреНрд╖рд╛рдПрдВ
internal
(рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ) рд░рд╣рддреА рд╣реИрдВ, рдФрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ "рдПрдкреАрдЖрдИ" рдХреЗ рд░реВрдк рдореЗрдВ
internal
рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдВрджрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ:
public struct VehicleViewControllerFactory { func makeBicycleViewController() -> UIViewController { return BicycleViewController() } func makeScooterViewController() -> UIViewController { return ScooterViewController() } }
рдХрд┐рд╕реА рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдмрдврд╝рд╛рдирд╛
рджреВрд╕рд░рд╛ "рдорд╛рдорд▓рд╛"
рд╡рд╕реНрддреБ рдХреЗ
рдЬрдЯрд┐рд▓ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗрд░реАрд╡рд╕реНрдХреА рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдмрд╛рд╣рд░ рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдЙрд╕реА рд╕рдордп рдХрд╛рд░ рдмреЗрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдФрд░ рдпрд╣ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрдХрдиреАрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЦреБрдж рдХреЛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдИрдВрдзрди рдХреЗ рдкреНрд░рдХрд╛рд░, рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд░рд┐рдо рдХреЗ рдЖрдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВ:
enum Condition { case new case used } enum EngineType { case diesel case gas } struct Engine { let type: EngineType } enum TransmissionType { case automatic case manual } final class CarViewController: UIViewController { private let condition: Condition private let engine: Engine private let transmission: TransmissionType private let wheelDiameter: Int init(engine: Engine, transmission: TransmissionType, wheelDiameter: Int = 16, condition: Condition = .new) { self.engine = engine self.transmission = transmission self.wheelDiameter = wheelDiameter self.condition = condition super.init(nibName: nil, bundle: nil) } required init?(coder aDecoder: NSCoder) { fatalError("CarViewController: init(coder:) has not been implemented.") } }
рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
let engineType = EngineType.diesel let engine = Engine(type: engineType) let transmission = TransmissionType.automatic let wheelDiameter = 18 let vc = CarViewController(engine: engine, transmission: transmission, wheelDiameter: wheelDiameter)
рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ "рдХрдВрдзреЗ" рдкрд░ рдЗрди рд╕рднреА "рдЫреЛрдЯреА рдЪреАрдЬреЛрдВ" рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
struct UsedCarViewControllerFactory { let engineType: EngineType let transmissionType: TransmissionType let wheelDiameter: Int func makeCarViewController() -> UIViewController { let engine = Engine(type: engineType) return CarViewController(engine: engine, transmission: transmissionType, wheelDiameter: wheelDiameter, condition: .used) } }
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рдПрдВ:
let factory = UsedCarViewControllerFactory(engineType: .gas, transmissionType: .manual, wheelDiameter: 17) let vc = factory.makeCarViewController()
рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐
рджреВрд╕рд░рд╛ "рд╕рд┐рдВрдЧрд▓-рд░реВрдЯ" рдЯреЗрдореНрдкреНрд▓реЗрдЯ рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХреЛ рдШреЗрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рднреАрддрд░ рдЫрд┐рдкрд╛рдХрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдмрд╣реБрд░реВрдкрддрд╛ рджреНрд╡рд╛рд░рд╛ред рдХреЗрд░рд┐рд╡реНрд╕реНрдХреА рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рдореЗрдВ
рдЬрд╛рд╡рд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ рдФрд░
рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ
рд╣реИрдВ , рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдлреНрдЯ рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЗ рдирд┐рд╡рд╛рд╕реА рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рдЕрдкрдирд╛ рдорд╛рд╣реМрд▓ рд╣реИ ... рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред
"рдЧреИрдВрдЧреНрд╕ рдСрдл рдлреЛрд░" рдкреБрд╕реНрддрдХ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ "рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рдЬрд╛рдЗрдирд░" рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рд╣реИред "C ++" рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЛ рдЖрднрд╛рд╕реА рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╣реБрдЖред
рдмрд╣реБрд░реВрдкреА рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм
рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдмрдирд╛рдИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣реЛрддрд╛ рд╣реИ ред рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЛ рдЙрдЪреНрдЪ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдКрдкрд░ рдЙрдард╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБ рдХреЛ рдмрд╣реБрд░реВрдк рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╣рдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:
final class BicycleViewController: UIViewController { } final class ScooterViewController: UIViewController { }
рдФрд░ рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЗрдХрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ
рд╕рдордиреНрд╡рдпрдХ , рдЬреЛ рдЗрди рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рджреВрд╕рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
protocol Coordinator { var presentingViewController: UIViewController? { get set } func start() }
start()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рддрд╛ рд╣реИ:
final class BicycleCoordinator: Coordinator { weak var presentingViewController: UIViewController? func start() { let vc = BicycleViewController() presentingViewController?.present(vc, animated: true) } } final class ScooterCoordinator: Coordinator { weak var presentingViewController: UIViewController? func start() { let vc = ScooterViewController() presentingViewController?.present(vc, animated: true) } }
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП:
protocol Coordinator { var presentingViewController: UIViewController? { get set } func start() func makeViewController() -> UIViewController }
рдФрд░ рдореВрд▓ рд╡рд┐рдзрд┐ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ:
extension Coordinator { func start() { let vc = makeViewController() presentingViewController?.present(vc, animated: true) } }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛:
final class BicycleCoordinator: Coordinator { weak var presentingViewController: UIViewController? func makeViewController() -> UIViewController { return BicycleViewController() } } final class ScooterCoordinator: Coordinator { weak var presentingViewController: UIViewController? func makeViewController() -> UIViewController { return ScooterViewController() } }
рдирд┐рд╖реНрдХрд░реНрд╖
рдореИрдВрдиреЗ рддреАрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдЗрд╕ рд╕рд░рд▓ рд╡рд┐рд╖рдп рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:
- "рдЧреИрдВрдЧреНрд╕ рдСрдл рдлреЛрд░" рдкреБрд╕реНрддрдХ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд░рд┐рд╕реЗрдкреНрд╢рди рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рдШреЛрд╖рдгрд╛;
- рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛, рдЦреБрд▓реЗ рддреМрд░ рдкрд░ рдХреЗрд░рд┐рд╡рд╕реНрдХреА рдХреА рдкреБрд╕реНрддрдХ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд;
- рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрджреНрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡реЗрджрди рдХрд┐рдпрд╛ред
рдЙрд╕реА рд╕рдордп, рдореИрдВрдиреЗ iOS рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рднрд╛рд╖рд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп C ++ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рдмрдЬрд╛рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрднрд╡ рд╣реЛ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрд░реАрдм рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╡рд┐рд╖рдп рд▓рд╛рдЧреВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рд╕рд╛рдордЧреНрд░реА рдвреВрдВрдврдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореМрдЬреВрджрд╛ рд▓реЗрдЦреЛрдВ рдФрд░ рдкреБрд╕реНрддрд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рддрд╣реА рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдХрдо рд╣реИрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдФрд░ рдкрд╛рдардХ - рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдореЗрд░реЗ рдЬреНрдЮрд╛рди рдХреЛ рдЬрд╛рдирдиреЗ рдпрд╛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рджрд┐рд▓рдЪрд╕реНрдкреА рдпрд╛ рдЙрддреНрд╕реБрдХ рдерд╛ред
рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдкрд░ рдореЗрд░реА рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА:рдФрд░ рдпрд╣ рдореЗрд░реЗ "рдЯреНрд╡рд┐рдЯрд░" рдХреА рдПрдХ рдХрдбрд╝реА рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВ рдЕрдкрдиреЗ рдирд┐рдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХред