Dá uma olhada em http://blaze.haughin.com

On Tue, Feb 26, 2008 at 2:07 PM, Osdeni José Sadzinski <[EMAIL PROTECTED]> 
wrote:
> Estamos desenvolvendo um CMS na empresa, utilizamos o CI na versao
>  1.5.4, com uma adaptação de modularização encontrada no wiki do CI
>  (Modular Separation) porém a mesma não funcionou qndo fomos migrar
>  para 1.6 (em função de tempo, permanecemos na 1.5.4)
>
>  Seguimos a estrutura que a Separation modular propões e estamos
>  gostando da mesma.
>
>  Precisamos criar uma pequena adaptação para questão de autenticação apenas.
>
>  application/modules/blog/controller
>                                      models
>                                      views
>
>
>
>
>  2008/2/26 Marcus Cavalcanti <[EMAIL PROTECTED]>:
>  > Aproveitando, um doc excelente que passa uma boa visão de como funciona o
>  > Drupal (in english):
>  >
>  > Drupal often gets criticized by newcomers who believe that object-oriented
>  > programming (OOP) is always the best way to design software architecture,
>  > and since they do not see the word "class" in the Drupal code, it must be
>  > inferior to other solutions. In fact, it is true that Drupal does not use
>  > many of the OOP features of PHP, but it is a mistake to think that the use
>  > of classes is synonymous with object-oriented design. This article will
>  > cover several of the features of Drupal from an object-oriented 
> perspective,
>  > so programmers comfortable with that paradigm can begin to feel at home in
>  > the Drupal code base, and hopefully be able to choose the right tool for 
> the
>  > job.
>  >
>  >  Motivations for Current Design
>  >  As of version 4.6, Drupal does not use PHP's class construct. This 
> decision
>  > was made for several reasons.
>  >
>  >  First, PHP's support for object-oriented constructs was much less mature 
> at
>  > the time of Drupal's design. Drupal was built on PHP 4, and most of the
>  > improvements in PHP 5 relate to its object-oriented features.
>  >
>  >  Second, Drupal code is highly compartmentalized into modules, each of 
> which
>  > defines its own set of functions. The inclusion of files is handled inside
>  > functions as well; PHP's performance suffers if all code is included on 
> each
>  > page call, so Drupal attempts to load as little code as possible per
>  > request. This is a critical consideration, especially in the absence of a
>  > PHP accelerator; the act of compiling the code accounts for more than half
>  > of a Drupal page request. Functions are therefore defined inside other
>  > functions in Drupal, with respect to the runtime scope. This is perfectly
>  > legal. However, PHP does not allow the same kind of nesting with class
>  > declarations. This means that the inclusion of files defining classes must
>  > be "top-level," and not inside any function, which leads either to slower
>  > code (always including the files defining classes) or a large amount of
>  > logic in the main index.php file.
>  >
>  >  Finally, using classes to implement Drupal constructs is difficult due to
>  > the use of some advanced object-oriented design patterns used by Drupal
>  > itself. While this may sound self-contradictory, it should become clear in
>  > the following discussion that the lack of certain OOP constructs such as
>  > Objective-C's "categories" in PHP would mean that implementing some Drupal
>  > mechanisms (such as the theme system) would be more complicated using
>  > classes than using functions.
>  >
>  >  OOP Concepts in Drupal
>  >  Despite the lack of explicitly-declared classes in Drupal, many
>  > object-oriented paradigms are still used in its design. There are many sets
>  > of "essential features" that are said to be necessary to classify a system
>  > as object-oriented; we will look at one of the more popular definitions and
>  > examine some ways in which Drupal exhibits those characteristics.
>  >
>  >  Objects
>  >  There are many constructs in Drupal that fit the description of an
>  > "object". Some of the more prominent Drupal components that could be
>  > considered objects are modules, themes, nodes, and users.
>  >
>  >  Nodes are the basic content building blocks of a Drupal site, and bundle
>  > together the data that makes up a "page" or "story" on a typical site. The
>  > methods that operate on this object are defined in node.module, usually
>  > called by the node_invoke() function. User objects similarly package data
>  > together, bringing together information about each account on the site,
>  > profile information, and session tracking. In both cases, the data 
> structure
>  > is defined by a database table instead of a class. Drupal exploits the
>  > relational nature of its supported databases to allow other modules to
>  > extend the objects with additional data fields.
>  >
>  >  Modules and themes are object-like as well, filling the "controller" role
>  > in many ways. Each module is a source file, but also bundles together
>  > related functions and follows a pattern of defining Drupal hooks.
>  >
>  >  Abstraction
>  >  Drupal's hook system is the basis for its interface abstraction. Hooks
>  > define the operations that can be performed on or by a module. If a module
>  > implements a hook, it enters into a contract to perform a particular task
>  > when the hook is invoked. The calling code need not know anything else 
> about
>  > the module or the way the hook is implemented in order to get useful work
>  > done by invoking the hook.
>  >
>  >  Encapsulation
>  >  Like most other object-oriented systems, Drupal does not have a way of
>  > strictly limiting access to an object's inner workings, but rather relies 
> on
>  > convention to accomplish this. Since Drupal code is based around functions,
>  > which share a single namespace, this namespace is subdivided by the use of
>  > prefixes. By following this simple convention, each module can declare its
>  > own functions and variables without the worry of conflict with others.
>  >
>  >  Convention also delineates the public API of a class from its internal
>  > implementation. Internal functions are prefixed by an underscore to 
> indicate
>  > that they should not be called by outside modules. For example,
>  > _user_categories() is a private function which is subject to change without
>  > notice, while user_save() is part of the public interface to the user 
> object
>  > and can be called with the expectation that the user object will be saved 
> to
>  > the database (even though the method of doing this is private).
>  >
>  >  Polymorphism
>  >  Nodes are polymorphic in the classical sense. If a module needs to display
>  > a node, for example, it can call node_view() on that node to get an HTML
>  > representation. The actual rendering, though, will depend on which type of
>  > node is passed to the function; this is directly analogous to having the
>  > class of an object determine its behavior when a message is sent to it.
>  > Drupal itself handles the same introspection tasks required of an OOP
>  > language's runtime library.
>  >
>  >  Furthermore, the rendering of the node in this example can be affected by
>  > the active theme. Themes are polymorphic in the same way; the theme is
>  > passed a "render this node" message, and responds to it in a different way
>  > depending on the implementation of the active theme, though the interface 
> is
>  > constant.
>  >
>  >  Inheritance
>  >  Modules and themes can define whatever functions they please. However, 
> they
>  > can both be thought to inherit their behavior from an abstract base class.
>  > In the case of themes, the behavior of this class is determined by the
>  > functions in theme.inc; if a theme does not override a function defined
>  > there, the default rendering of an interface component is used, but the
>  > theme can instead provide its own rendering. Modules similarly have the
>  > selection of all Drupal hooks to override at will, and may pick and choose
>  > which ones to implement.
>  >
>  >  Design Patterns in Drupal
>  >  Much of Drupal's internal structure is more complicated than simple
>  > inheritance and message passing, however. The more interesting features of
>  > the system result from using established software design patterns. Many of
>  > the patterns detailed in the seminal Gang of Four Design Patterns book can
>  > be observed in Drupal, for instance.
>  >
>  >  Singleton
>  >  If we are to think of modules and themes as objects, then they follow the
>  > singleton pattern. In general these objects do not encapsulate data; what
>  > separates one module from another is the set of functions it contains, so 
> it
>  > should be thought of as a class with a singleton instance.
>  >
>  >  Decorator
>  >  Drupal makes extensive use of the decorator pattern. The polymorphism of
>  > node objects was discussed earlier, but this is only a small piece of the
>  > power of the node system. More interesting is the use of hook_nodeapi(),
>  > which allows arbitrary modules to extend the behavior of all nodes.
>  >
>  >  This feature allows for a wide variety of behaviors to be added to nodes
>  > without the need for subclassing. For instance, a basic story node has only
>  > a few pieces of associated data: title, author, body, teaser, and a handful
>  > of metadata. A common need is for files to be uploaded and attached to a
>  > node, so one could design a new node type that had the story node's 
> features
>  > plus the ability to attach files. Drupal's upload module satisfies this 
> need
>  > in a much more modular fashion by using nodeAPI to grant every node that
>  > requests it the ability to have attached files.
>  >
>  >  This behavior could be imitated by the use of decorators, wrapping them
>  > around each node object. More simply, languages that support categories,
>  > like Objective-C, could augment the common base class of all node objects 
> to
>  > add the new behavior. Drupal's implementation is a simple ramification of
>  > the hook system and the presence of node_invoke_all().
>  >
>  >  Observer
>  >  The above interaction is also similar to the use of observers in
>  > object-oriented systems. This Observer pattern is pervasive throughout
>  > Drupal. When a modification is made to a vocabulary in Drupal's taxonomy
>  > system, the taxonomy hook is called in all modules that implement it. By
>  > implementing the hook, they have registered as observers of the vocabulary
>  > object; any changes to it can then be acted on as is appropriate.
>  >
>  >  Bridge
>  >  The Drupal database abstraction layer is implemented in a fashion similar
>  > to the Bridge design pattern. Modules need to be written in a way that is
>  > independent of the database system being used, and the abstraction layer
>  > provides for this. New database layers can be written that conform to the
>  > API defined by the bridge, adding support for additional database systems
>  > without the need to modify module code.
>  >
>  >  Chain of Responsibility
>  >  Drupal's menu system follows the Chain of Responsibility pattern. On each
>  > page request, the menu system determines whether there is a module to 
> handle
>  > the request, whether the user has access to the resource requested, and
>  > which function will be called to do the work. To do this, a message is
>  > passed to the menu item corresponding to the path of the request. If the
>  > menu item cannot handle the request, it is passed up the chain. This
>  > continues until a module handles the request, a module denies access to the
>  > user, or the chain is exhausted.
>  >
>  >  Command
>  >  Many of Drupal's hooks use the Command pattern to reduce the number of
>  > functions that are necessary to implement, passing the operation as a
>  > parameter along with the arguments. In fact, the hook system itself uses
>  > this pattern, so that modules do not have to define every hook, but rather
>  > just the ones they care to implement.
>  >
>  >  Why Not to Use Classes
>  >  The above hopefully clarifies the ways in which Drupal embodies various 
> OOP
>  > concepts. Why, then, doesn't Drupal move in the direction of using classes
>  > to solve these problems in the future? Some of the reasons are historical,
>  > and were discussed earlier. Others, though, become clearer now that we have
>  > stepped through some of the design patterns used in Drupal.
>  >
>  >  A good example is the extensibility of the theme system. A theme defines
>  > functions for each of the interface elements it wants to display in a
>  > special way. As noted earlier, this makes themes seem like a good candidate
>  > to inherit from an abstract base class that defines the default rendering 
> of
>  > the elements.
>  >
>  >  What happens, though, when a module is added that adds a new interface
>  > element? The theme should be able to override the rendering of this element
>  > as well, but if a base class is defined, the new module has no way of 
> adding
>  > another method to that class. Complicated patterns could be set up to
>  > emulate this behavior, but Drupal's theme architecture quite elegantly
>  > handles the situation using its own function dispatch system. In this case
>  > and others like it, the classes that on the surface simplify the system end
>  > up serving to make it more cumbersome and difficult to extend.
>  >
>  >  Room for Improvement
>  >  While Drupal does reflect many object-oriented practices, there are some
>  > aspects of OOP that could be brought to bear on the project in more 
> powerful
>  > ways.
>  >
>  >  Encapsulation, while adequate in theory, is not applied consistently 
> enough
>  > across the code base. Modules should more rigorously define which functions
>  > are public and which are private; the tendency right now is to publish most
>  > functions in the public namespace even if the interface is volatile. This
>  > problem is exacerbated by Drupal's policy of forgoing backward 
> compatibility
>  > in exchange for cleaner APIs whenever necessary. This policy has led to 
> some
>  > very good code, but would need to be excercised much less often if better
>  > encapsulation conventions were followed.
>  >
>  >  Inheritance is also weak in the system. While, as noted above, all modules
>  > share a common set of behavior, it is difficult to extend this to new
>  > modules. One can create new modules easily that augment the behavior of
>  > existing ones, but there is not a way to override just some of a module's
>  > behavior. The impact of this can be marginalized by breaking large modules
>  > into smaller "a la carte" bundles of functionality, so that undesired
>  > aspects of a module may be more easily left out of the system.
>  >
>  >  Other Paradigms
>  >  Drupal is on the surface a procedural system, because it is built in a
>  > procedural language (PHP without classes). The paradigm behind a piece of
>  > software is not entirely dependent on its representation in code, however.
>  > Drupal is not afraid to borrow concepts from many disparate programming
>  > paradigms where it is convenient. A great deal of the power of Drupal comes
>  > from its underlying relational database, and relational programming
>  > techniques that mirror it. The fact that Drupal's work, much like that of
>  > any web application, consists of many reactions to discrete and rapid page
>  > requests should make the behavior of the system resonate with proponents of
>  > event-driven programming. To an aspect-oriented programmer, the invocation
>  > of hooks in arbitrary modules may look strikingly similar to a pointcut.
>  > And, as should be abundantly clear by now, Drupal is no stranger to
>  > object-oriented concepts either."
>  >
>  > 2008/2/26 Marcus Cavalcanti <[EMAIL PROTECTED]>:
>  >
>  >
>  > > Gustavo,
>  > >
>  > > Eu já li alguma coisa sobre modularização com CI no Wiki, mas lembro que
>  > era algo bem superficial, mas muito provavelmente esse assunto já deve ter
>  > sido debatido aos montes no fórum do CI, portanto dê uma procurada lá que
>  > você pode achar algo que lhe ajude. Existem também alguns projetos de CMS
>  > com CI, dê uma olhada em algum, de repente é mais interessante você
>  > contribuir para um já bem encaminhado do que começar um do 0...
>  > >
>  > > Se eu tivesse tempo hábil, um dos meus projetos pessoais, seria fazer um
>  > CMS genérico com a arquitetura do CI/Kohana, mas baseado na arquitetura do
>  > Drupal. Você conhece o Drupal? O Drupal é fascinante, sem dúvidas um dos
>  > melhores, senão o melhor projeto open-source do PHP, um case de sucesso que
>  > todo ano recebe vários prêmios bizarros e é usado em gigantes como Sony,
>  > MTV, NASA, etc ... confesso que no começo eu tinha um certo preconceito com
>  > o Drupal, por ele não ser OO, por ele não ser MVC, por ele não ser várias
>  > coisas, mas depois eu vi, é que o problema é que eu não conhecia o Drupal o
>  > suficiente e que minhas  conclusões eram totalmente precipitadas, agora
>  > conhecendo melhor o Drupal eu percebo que ele é OO sem ser OO
>  > explicitamente, que ele é MVC sem sem ser MVC explicitamente e que ele usa
>  > Patterns o tempo todo sem ser explícito .. a curva de aprendizado é um
>  > poquinho grande, mas depois que você conhece e entende como as coisas
>  > funcionam, vc se apaixona .. "amor a segunda vista" digamos assim ..
>  > >
>  > > O Drupal é todo modularizado, onde cada módulo tem sua própria API
>  > definida pela API de Hooks do Drupal, com suporte a dependências, interação
>  > com outros módulos, interação com o core e tudo de forma independente,
>  > fantástico! Ainda tem suporte a categorias no formato de taxonomias, que é
>  > um formato avançado para organização de conteúdo usado por exemplo em
>  > gigantes do ecommerce como americanas, submarino, shoptime ... tem uma api
>  > de form que é muito fácil fazer forms, internacionalização fácil, rápida e
>  > eficaz através de arquivos de termos, enfim, uma enfinidade de coisas
>  > sólidas e bem definidas... o Drupal está na versão 6 (saiu recentemente) e
>  > aconselho que você olhe com calma, tempo e profundamente ... e o drupal tem
>  > módulo para praticamente tudo! testes unitários, automatizados, 
> integrações,
>  > fórums, blogs, serviços (web services), google, amazon .. sinistro!
>  > >
>  > > www.drupal.org
>  > >
>  > > Enjoy :)
>  > >
>  > >
>  > >
>  > > 2008/2/26 Gustavo Villa <[EMAIL PROTECTED]>:
>  > >
>  > >
>  > >
>  > >
>  > > > Quem aqui trabalha com CodeIgniter como CMS?
>  > > > Estou montando a arquitetura do sistema que usaremos num projeto de CMS
>  > > > OpenSource colaborativo, e tenho algumas questões que gostaria de
>  > > > discutir com quem já tem um pouco mais de experiência em CI.
>  > > >
>  > > > Basicamente são questões como:
>  > > > - Qual a melhor arquitetura para separar diversos módulos/componentes 
> em
>  > > > uma única pasta? ex.: application/modules/NomeDoModulo
>  > > > - Como separar as views dos módulos da view do sistema?
>  > > > /modules/NomeDoModulo/view?
>  > > > - Como implementar essas coisas sem que seja preciso alterar o CI. 
> Quero
>  > > > manter o CI sempre atualizado com novas versões disponibilizadas.
>  > > >
>  > > > Podem entrar em contato comigo via e-mail?
>  > > >
>  > > >
>  > > >
>  > > >
>  > > > _______________________________________________
>  > > > Lista mailing list
>  > > > [email protected]
>  > > > http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
>  > > >
>  > >
>  > >
>  >
>  >
>  > _______________________________________________
>  >  Lista mailing list
>  >  [email protected]
>  >  http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
>  >
>  >
>
>
>
>  --
>  Abraços,
>
>  Osdeni José Sadzinski
>  E-mail: [EMAIL PROTECTED]
>  Telefone: (48) 9916-3735
>
>
>
>  _______________________________________________
>  Lista mailing list
>  [email protected]
>  http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br
>



-- 
Felipe Diesel
http://felipediesel.net
http://sigasw.com.br
_______________________________________________
Lista mailing list
[email protected]
http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br

Responder a