Usando o `começar' e o `ajustado' pôde ser algo que você lamentará
| by V. Berba Velasco Jr., Ph.D. | October 07, 2006
É um pitfall todo-demasiado-comum. Os programadores que tentam escrever código object-oriented decidem-se fazer tudo de suas variáveis dos dados confidencial, ao criar o público começam () e ajustam () pares da função para cada. “Ver?” declaram, porque pat em suas partes traseiras. “Os dados são confidenciais, mas podem ser alcançados com estas funções. Eu encapsulated meus dados. Aquele é o que o projeto object-oriented requer.”
Eu penso que este betrays um engano fundamental (e exceedingly terra comum) de o que constitui o encapsulation e esconder da informação. Idealmente, em um projeto object-oriented, o usuário de uma classe do software não deve não ter nenhuma idéia que tipo de dados a classe contem. Tanto quanto concerniu, a classe deve simplesmente fornecer os serviços requeridos, e seus detalhes internos devem ser invisíveis. Entretanto, quando nós fornecemos começar () e ajustar () pares da função para cada variável do membro, nós estamos anunciando bàsicamente a existência destes dados ao mundo. Esconder da informação fornecido por esta classe é fraco-e arguably inexistente. Um pôde mudar o nome, tipo de dados ou execução desta variável do membro, mas seu remains da existência dolorosa óbvio a todos.
(A nota que eu digo que o usuário se “idealmente” ser oblivious ao tipo de dados conteve dentro da classe. Na prática, isto não é sempre praticável. Se nós devêssemos executar uma classe de BankAccount, por exemplo, a maioria de programadores suporia imediatamente que esta classe teria o contrapeso do cliente como um de seus membros dos dados. Supõem-rightfully também de modo que o proprietário deste cliente fosse provável ser membro dos dados também. Não obstante, nós devemos evitar needlessly de divulging tais detalhes, especialmente quando os índices de uma classe não são discernidos assim fàcilmente.)
De fato, estes começam () e as funções do membro do jogo () são quase tão más quanto tendo dados públicos. Certa, podem fornecer alguns serviços úteis; por exemplo, a função do jogo () poderia validar os dados, assegurando-se de que estivesse dentro da escala apropriada dos valores. Não obstante, tendem a violate o espírito da informação que esconde, pelo menos a algum grau.
Usar-se começa () e as funções do jogo () não são sempre uma idéia má; no fato, às vezes fazem o sentido perfeito. Seu uso freqüente, entretanto, é uma indicação boa bonita de um software mal abstraído projeta-um que não adira bem ao princípio de esconder da informação. Quando projetar o software classifica, nós necessitamos pensar primeiramente nos termos dos serviços que fornecem (isto é suas funções públicas), melhor que nos dados contêm. Idealmente, suas execuções dos dados devem proseguir dos serviços requeridos, melhor que da outra maneira ao redor.
Para ilustrar este conceito, deixar-nos revisitar a classe de BankAccount mencionada mais cedo. Está desobstruído que o objeto de BankAccount necessitará se manter a par de seu contrapeso, assim que vamos fazer a isso um membro dos dados. Um programador do novice (ou um com um aperto pobre da orientação do objeto) podem escolher fornecer funções de GetBalance () e de SetBalance () para esta classe… mas fazem este sentido do make?
Que acontece quando um usuário tenta fazer um depósito? O usuário teria que chamar GetBalance (), adiciona a quantidade do depósito, e ajusta então o valor novo usando GetBalance (). Isso não é como os usuários reais se operam, though; no mundo real, não há nenhuma necessidade para o depositante saber quanto dinheiro está no cliente. Este projeto da classe dá ao usuário demasiada informação e requer etapas demais.
Similarmente, para executar uma retirada, o usuário necessitaria chamar GetBalance (), subtrai a quantidade da retirada, e chama então SetBalance () para atualizar o cliente. Isto requer também demasiado trabalho na divisória do usuário. No mundo real, o usuário não deve sempre ser requerido saber exatamente quanto dinheiro está no cliente. Esta pessoa pôde querer saber que há fundos suficientes, mas não necessitaria necessariamente saber o contrapeso preciso, e esta informação não deve ser uma exigência constante.
Uma classe sensibly escrita deve fornecer os seguintes serviços preferivelmente: DepositAmount (), WithdrawAmount () e GetBalance (). Com este projeto, o cliente do membro- dos dados contrapeso-é implicado logicamente pelos serviços fornecidos, melhor que pela outra maneira ao redor. (Nós poderíamos definir outros serviços, tais como AccrueInterest () e TransferFunds (), mas vamos o manter simples para agora. Anotar que estes serviços puderam sugerir membros adicionais dos dados; por exemplo, AccrueInterest () sugeriria que um membro dos dados seria needed para a taxa de interesse.)
Em resumo, começar () e os pares da função do jogo () não são inerente maus, mas seu preponderance poderia sugerir um projeto mal abstraído do software. Não há nada inerente errado com usar-se começa () e ajusta () funções quando dão forma à parte de um jogo sensibly projetado dos serviços. Nem há qualquer coisa erradamente com usar um membro dos dados refletir estas funções. Quando um prosegue no sentido oposto, embora-quando um começa com os membros dos dados, adiciona então corresponder começam () e ajustam-se () par-que é uma indicação forte de um projeto mal conceived do software.
Article Source: http://www.articleset.com

You are welcome to publish or reprint this article free of charge, provided:
- you include the entire article, unchanged, including the "About The Author" box
- all hyperlinks remain active, including the bottom ArticleSet.com link (does not apply to print publications)
- you agree not to hold the authors nor ArticleSet.com liable for any loss profits, expenses, or any other damages resulting from the use or misuse of articles published on this website