Page 39 - Revista_60.pub
P. 39

A PROGRAMAR







                                                              CLASSES DE INFRAESTRUTURA: A CLASSE USING

               Result := Action(Obj);                               class procedure New
           finally                                                    <T: class, constructor>
             Obj.Free;                                                (Action: TProc<T>);
           end;                                                       overload; static;
         end;                                                       class function New
                                                                      <T: class, constructor; TResult>
         class function Using.New<T, TResult>                         (Obj: T; Action: TFunc<T, TResult>)
           (Action: TFunc<T>): TResult;                               : TResult; overload; static;
         begin                                                      class function New
           Result := New<T, TResult>(                                 <T: class, constructor; TResult>
             T.Create,                                                (Action: TFunc<T, TResult>)
             Action                                                   : TResult; overload; static;
           );                                                     end;
         end;

              Como se pode ver, a implementação é bastante pareci-
         da com os dois métodos anteriores. Apenas estamos a acres-
         centar um parâmetro genérico TResult que será o tipo de re-      Um bom design
         sultado que as funções irão retornar.

              No caso de TResult, não foram aplicadas restrições, o   OOP deve procurar que
         que significa que mesmo tipos de dados primitivos serão váli-  cada objeto represente
         dos para o retorno da ação.

              Uma possível utilização para estes novos métodos se-  uma entidade real, uma
         ria:

         (* Método 4 *)                                          parte do todo que é o
         var
           SomeString: string;
         begin                                                   software, com uma res-
           SomeString :=
             Using.New<TBar, string>(                            ponsabilidade bem de-
               function (Bar: TBar): string
               begin
                 Result := Bar.Text;                             finida e uma vida útil
               end
             );
         end;                                                    determinada pelo exer-

              Vejamos então como ficaria a nossa Unit completa para   cício dessa responsa-
         a classe Using:
                                                                 bilidade, e não mais do
         unit RO.Using;

         interface                                               que isso. Uma classe

         uses
             SysUtils                                            utilitária ou um método
           ;

         type                                                    estático acabam por ir
           Using = class
           public
             class procedure New                                 contra o exercício des-
               <T: class, constructor>
               (Obj: T; Action: TProc<T>);
               overload; static;                                 se objetivo.



         AUTOR


                       Escrito por  Nuno Picado
                       Autodidata na área de programação, vê o percurso de aprendizagem da programação como um fim em si
                       mesmo. Considera o pensamento lógico deveria ser de ensino fundamental, tanto quanto português e
                       matemática, o que se conseguiria com ensino de técnicas de programação logo a partir do primeiro ciclo.
                       Autor de projetos como Reusable Objects e AtWS (anteriormente conhecido como WS-DLL), considera
                       que a partilha de conhecimento é o melhor mecanismo de evolução da racionalidade


                                                           39
   34   35   36   37   38   39   40   41   42   43   44