<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Mathieu ATTAL &#187; Design pattern</title>
	<atom:link href="https://blog.developpez.com/zapoutix/pcategory/design-pattern/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/zapoutix</link>
	<description></description>
	<lastBuildDate>Sat, 11 Jul 2009 10:21:36 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>[Design pattern Factory] A mort le héro.</title>
		<link>https://blog.developpez.com/zapoutix/p7874/design-pattern/design_pattern_factory_a_mort_le_hero</link>
		<comments>https://blog.developpez.com/zapoutix/p7874/design-pattern/design_pattern_factory_a_mort_le_hero#comments</comments>
		<pubDate>Sat, 11 Jul 2009 10:12:20 +0000</pubDate>
		<dc:creator><![CDATA[zapoutix]]></dc:creator>
				<category><![CDATA[Design pattern]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Apprenons le Design pattern Factory par un exemple. Prenons un code développé sans Design pattern : class Program { static void Main(string[] args) { Program p = new Program(); p.RunShell(); } public void RunShell() { bool finished = false; while (!finished) { Console.Write(&#171;&#160;&#62;&#160;&#187;); String line = Console.ReadLine(); String[] lineArgs = line.Split(new char[] { &#8216; &#8216;, &#8216;\t&#8217; }); switch (lineArgs[0]) { case &#171;&#160;exit&#160;&#187;: Console.WriteLine(&#171;&#160;Bye bye&#160;&#187;); finished = true; break; case &#171;&#160;help&#160;&#187;: Console.WriteLine(&#171;&#160;Help :&#160;&#187;); Console.WriteLine(&#171;&#160;&#8212;&#8212;&#171;&#160;); Console.WriteLine(&#171;&#160;copy: copy [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Apprenons le Design pattern Factory par un exemple.<br />
Prenons un code développé sans Design pattern :</p>
<blockquote><p>
    class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {<br />
            Program p = new Program(); </p>
<p>            p.RunShell();<br />
        } </p>
<p>        public void RunShell()<br />
        {<br />
            bool finished = false; </p>
<p>            while (!finished)<br />
            {<br />
                Console.Write(&laquo;&nbsp;&gt;&nbsp;&raquo;);<br />
                String line = Console.ReadLine();<br />
                String[] lineArgs = line.Split(new char[] { &lsquo; &lsquo;, &lsquo;\t&rsquo; }); </p>
<p>                switch (lineArgs[0])<br />
                {<br />
                    case &laquo;&nbsp;exit&nbsp;&raquo;:<br />
                        Console.WriteLine(&laquo;&nbsp;Bye bye&nbsp;&raquo;);<br />
                        finished = true;<br />
                        break;<br />
                    case &laquo;&nbsp;help&nbsp;&raquo;:<br />
                        Console.WriteLine(&laquo;&nbsp;Help :&nbsp;&raquo;);<br />
                        Console.WriteLine(&laquo;&nbsp;&#8212;&#8212;&laquo;&nbsp;);<br />
                        Console.WriteLine(&laquo;&nbsp;copy: copy a file&nbsp;&raquo;);<br />
                        Console.WriteLine(&laquo;&nbsp;exit: exit the program&nbsp;&raquo;);<br />
                        // &#8230;<br />
                        // &#8230;<br />
                        // &#8230;<br />
                        break;<br />
                    case &laquo;&nbsp;copy&nbsp;&raquo;:<br />
                        if (lineArgs.Length == 3)<br />
                            Console.WriteLine(String.Format(&laquo;&nbsp;copy {0} {1}&nbsp;&raquo;, lineArgs[1], lineArgs[2]));<br />
                        else<br />
                            Console.WriteLine(&laquo;&nbsp;Invalid arguments: copy &lt;source&gt; &lt;destination&gt;&nbsp;&raquo;);<br />
                        break;<br />
                    // &#8230;<br />
                    // &#8230;<br />
                    // &#8230;<br />
                    default:<br />
                        Console.WriteLine(&laquo;&nbsp;Unknow command&nbsp;&raquo;);<br />
                        break;<br />
                } </p>
<p>            }<br />
        }<br />
    }
</p></blockquote>
<p><span id="more-5"></span><br />
Le principal problème de ce code, c’est que la class <span style="color: #ff0000;">Program</span> est le héro du code, c’est elle qui fait tout, et qu’au fur et a mesure de l’ajout de nouvelles commandes celle-ci va grossir, <strong>grossir</strong>, <strong><em>grossir </em></strong>… jusqu&rsquo;à devenir inmaintenable. Il faudra réfactorer le code, voir le réécrire, et plus on attend et plus se sera compliqué.</p>
<p>Pour faire un découpage simple, efficace  et donc éviter le héro nous pouvons utiliser le design pattern Factory pour cet exemple.</p>
<p>Interface de commandes</p>
<blockquote><p>
    public interface ICommand<br />
    {<br />
        void Init(String[] args);<br />
        bool Execute(ref bool isFinished);</p>
<p>        String Name<br />
        {<br />
            get;<br />
        }<br />
    }
</p></blockquote>
<p>Implémentation de la commande <em>Copy</em></p>
<blockquote><p>
    public class Copy : ICommand<br />
    {<br />
        String[] m_args;</p>
<p>        #region ICommand Membres</p>
<p>        public void Init(String[] args)<br />
        {<br />
            m_args = args;<br />
        }</p>
<p>        public bool Execute(ref bool isFinished)<br />
        {<br />
            if (m_args.Length != 3)<br />
            {<br />
                Console.WriteLine(&laquo;&nbsp;Invalid arguments: copy &lt;source&gt; &lt;destination&gt;&nbsp;&raquo;);<br />
                return false;</p>
<p>            }<br />
            Console.WriteLine(String.Format(&laquo;&nbsp;copy {0} {1}&nbsp;&raquo;, m_args[1], m_args[2]));<br />
            return true;<br />
        }</p>
<p>        public string Name<br />
        {<br />
            get { return &laquo;&nbsp;copy&nbsp;&raquo;; }<br />
        }</p>
<p>        #endregion<br />
    }
</p></blockquote>
<p>Implémentation de la commande <em>Exit</em></p>
<blockquote><p>
    public class Exit : ICommand<br />
    {<br />
        #region ICommand Membres</p>
<p>        public void Init(String[] args)<br />
        {<br />
        }</p>
<p>        public bool Execute(ref bool isFinished)<br />
        {<br />
            Console.WriteLine(&laquo;&nbsp;Bye bye&nbsp;&raquo;);<br />
            isFinished = true;</p>
<p>            return true;<br />
        }</p>
<p>        public string Name<br />
        {<br />
            get { return &laquo;&nbsp;exit&nbsp;&raquo;; }<br />
        }</p>
<p>        #endregion<br />
    }
</p></blockquote>
<p>Implémentation de la commande <em>Help</em></p>
<blockquote><p>
    public class Help : ICommand<br />
    {<br />
        #region ICommand Membres</p>
<p>        public void Init(String[] args)<br />
        {<br />
        }</p>
<p>        public bool Execute(ref bool isFinished)<br />
        {<br />
            Console.WriteLine(&laquo;&nbsp;Help :&nbsp;&raquo;);<br />
            Console.WriteLine(&laquo;&nbsp;&#8212;&#8212;&laquo;&nbsp;);<br />
            Console.WriteLine(&laquo;&nbsp;copy: copy a file&nbsp;&raquo;);<br />
            Console.WriteLine(&laquo;&nbsp;exit: exit the program&nbsp;&raquo;);<br />
            // &#8230;<br />
            // &#8230;<br />
            // &#8230;</p>
<p>            return true;<br />
        }</p>
<p>        public string Name<br />
        {<br />
            get { return &laquo;&nbsp;help&nbsp;&raquo;; }<br />
        }</p>
<p>        #endregion</p>
<p>    }
</p></blockquote>
<p>Implémentation de la Factory</p>
<blockquote><p>
    class CommandFactory<br />
    {<br />
        private static List&lt;ICommand&gt; m_commands = new List&lt;ICommand&gt;<br />
            (<br />
                new ICommand[]<br />
                {<br />
                    new Exit(),<br />
                    new Copy(),<br />
                    new Help()<br />
                }<br />
            );</p>
<p>        public static ICommand GetCommand(String line)<br />
        {<br />
            String[] tab = line.Split(new char[] { &lsquo; &lsquo;, &lsquo;\t&rsquo; });</p>
<p>            return GetCommand(tab);<br />
        }</p>
<p>        public static ICommand GetCommand(String[] args)<br />
        {<br />
            foreach (ICommand command in m_commands)<br />
            {<br />
                if (command.Name == args[0])<br />
                {<br />
                    ICommand cmd = (ICommand)Activator.CreateInstance(command.GetType());<br />
                    cmd.Init(args);</p>
<p>                    return cmd;<br />
                }<br />
            }</p>
<p>            return null;<br />
        }<br />
    }
</p></blockquote>
<p>La class Program</p>
<blockquote><p>
    class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {<br />
            Program p = new Program();</p>
<p>            p.RunShell();<br />
        }</p>
<p>        private void RunShell()<br />
        {<br />
            bool finished = false;</p>
<p>            while (!finished)<br />
            {<br />
                Console.Write(&laquo;&nbsp;&gt;&nbsp;&raquo;);<br />
                String line = Console.ReadLine();</p>
<p>                ICommand cmd = CommandFactory.GetCommand(line);<br />
                if (cmd != null)<br />
                    cmd.Execute(ref finished);<br />
                else<br />
                    Console.WriteLine(&laquo;&nbsp;Unknow command&nbsp;&raquo;);<br />
            }<br />
        }<br />
    }
</p></blockquote>
<p><center><br />
<img src="http://www.imageenvision.com/sm/0025-0806-0218-1640_clip_art_graphic_of_a_geeky_caucasian_businessman_cartoon_character_dressed_as_a_super_hero.jpg" alt="" /><br />
Malgrè son nom, le héro est un anti pattern</p>
<p></center></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
