Eu já vi isso repetir normalmente que a programação orientada a objetos se baseia na modelagem do mundo real, mas é?
Parece-me que isso não se aplica a nada fora da camada de negócios. Minhas classes de GUI / classes de acesso a dados não estão modelando nada no mundo real. Mesmo na minha camada de negócios, tenho aulas como observadores, gerentes, fábricas etc. que não são objetos do mundo real. Eu tento criar minhas aulas para tirar proveito de coisas como encapsulamento, mas o mundo real é encapsulado?
Enquanto alguns objetos que eu crio estão modelando objetos do mundo real, o código pré-OOP não faria o mesmo? Duvido que a OO tenha sido a primeira pessoa a incluir conceitos como Customer em suas bases de código. Mas OO é realmente sobre como modelar as coisas, e esse método de modelagem não parece inspirado no mundo real para mim.
Então: a programação orientada a objetos realmente modela o mundo real?
fonte
modeling the real world
pode não ser o que realmente diferencia o OO. Talvez. Mas eu definitivamente não vou acreditar que você também falhará em OO. Qual paradigma ou técnica você acha que o torna melhor que OO?Respostas:
Não, não mesmo.
No entanto, é uma metodologia que permite criar uma boa abstração para manter estruturas de dados complexas, juntamente com alguns métodos que atuam nas estruturas de dados.
fonte
Modelos, de qualquer tipo, não modelam o mundo real, não inteiramente.
Eles modelam partes selecionadas , aquelas que são relevantes para o aplicativo em questão.
O que você está falando (observadores, gerentes, fábricas etc ...) é a infraestrutura que existe para ajudá-lo a obter a abstração correta e dar suporte a funções necessárias, como persistência.
fonte
Enfim, o que é um modelo:
um modelo é uma representação simplificada usada para explicar o funcionamento de um sistema ou evento do mundo real
Definitivamente sim
É quase impossível modelar o sistema para corresponder exatamente ao mundo real.
NÃO
Dito isto, você pode modelar tudo não significa que você precise modelar tudo. De fato, a essência da modelagem útil é apresentar uma representação simplificada. Quanta simplificação é suficiente para expressar a necessidade atual dos negócios e o que precisa ser omitido é um bom equilíbrio entre o uso bem-sucedido da técnica e a perda ou não utilização da mesma.
É claro que existem entidades que realmente não existem, mas somente através da modelagem podemos realmente conceituar bem.
fonte
Penso que ensinar que existe uma relação entre substantivos e classes causa o desenvolvimento de maus hábitos irritantes que precisam ser esmagados mais tarde por um arquiteto impaciente ou engenheiro sênior.
O que deve ser ensinado é que as aulas modelam objetos abstratos, assim como o seu cérebro. Você tem um conceito abstrato de "carro" em sua cabeça que não é mapeado para nenhum carro físico em particular; é reutilizável, implementações específicas de carro podem herdar dele. Seu cérebro até meta-modela conceitos para você. Você tem um modelo mental do que é o pensamento, o que é um conceito.
Se ensinássemos as pessoas a identificar os modelos que já estão gerando em sua cabeça, elas estariam muito melhor preparadas para criar software real.
fonte
citação fonte: Victoria Livschitz, O próximo passo na programação
fonte
this.MoveTo(Environment.Find<Bathroom>().OrderBy(b=>b.Distance(this)).First()); this.SitOn(Environment.Find<Toilet>().Where(t=>!t.IsOccupied).OrderBy(t=>t.Distance(this)).First().Component<Seat>()); this.DiscardWaste(HumanWasteType.All);
Sim, o OO geralmente pode ser usado para modelar entidades do mundo real.
Não confunda desenvolvimento orientado a objetos com padrões de design. A análise e o projeto de OO são um meio de abordar o código de manutenção de programação. Juntamente com uma linguagem OO, os programadores têm o poder de criar código reutilizável através dos pilares da OO: encapsulamento, polimorfismo e herança.
Para encapsular uma entidade, podemos modelá-la após sua contraparte no mundo real. Por exemplo, se temos um violão, uma aula de violão encapsula os comportamentos e propriedades de um violão do mundo real. Podemos abstrair ainda mais o violão, como, por exemplo,
IInventoryItem
para tirar proveito do potencial de reutilização de código por meio de polimorfismo e herança.Por outro lado, podemos descobrir que uma fábrica de guitarras poderia nos ajudar a manter um conjunto de diferentes tipos de guitarras. Isso não é por causa do OO. Em vez disso, uma fábrica é um padrão de design que resistiu ao teste do tempo como um meio comprovado de criar com êxito códigos manteníveis para esse fim. Em outras palavras, nós programadores estamos frequentemente resolvendo problemas semelhantes. Por isso, criamos uma solução comum para resolvê-los (não reinvente a roda).
Isso não significa que a OO precise modelar o mundo real, nem que seja sempre a solução mais ideal para isso. Simplesmente, como regra geral, “OO modelando o mundo real” faz todo o sentido.
fonte
Depende do mundo real que você está falando.
Jorge Luis Borges escreveu uma história "Tlön, Uqbar, Orbis Tertius", onde um dos povos habitantes parece perceber seu mundo real de maneira bem diferente:
Para mim, a questão não é tanto que o mundo possa ser percebido de maneira diferente da nossa, o que é meio clichê, mas essa percepção da estrutura da realidade depende da linguagem que falamos, seja uma linguagem natural ou de programação. Os Tlönese podem estar muito felizes com Lisp, e podem ver Java (também conhecido como Reino dos Substantivos ) como algo antinatural, enquanto a maioria dos programadores terranos tendem a preferir objetos orientados a linguagens funcionais. Gosto dos dois estilos, pois acho que é principalmente uma questão de perspectiva. Alguns problemas são melhor atacados com funcionais, outros com técnicas de programação orientada a objetos. Um bom programador sempre olha para um problema difícil de diferentes ângulos, antes de tentar uma solução. Ou, como Alan Kay disse: o ponto de vista vale 80 pontos de QI .
Então, minha resposta para sua pergunta é: De que mundo você está falando? E como?
fonte
Eu diria que não. OOP vincula a relação entre as coisas (propriedades / objetos) e o que elas podem fazer / podem ser feitas com elas (métodos), enquanto a programação procedural não faz isso (além de, em pequeno grau, ao usar a digitação estrita). Um modelo não é apenas definir partes e processos distintos, mas também definir como eles se encaixam, e o POO é particularmente bom nisso.
fonte
Sim. A ênfase aqui é baseada . OOP não modela o mundo real (se sim, então aliás) e não deveria. O que o OOP faz é nos permitir modelar problemas de programação da maneira como modelamos o mundo real: como um sistema de entidades que são definidas através da abstração de seu comportamento.
fonte
O código OO geralmente não modela o mundo real - pelo menos esse não é o objetivo, ele simplesmente permite que você pense sobre seu código de uma maneira que seja mais natural, mais parecida com a maneira como você pensa sobre as coisas no mundo real-- é isso que a citação está tentando dizer.
fonte
Não modela o nosso mundo, mas modela a interpretação humana do nosso mundo. Os seres humanos naturalmente separam as coisas como objetos. OO é eficaz porque permite que os humanos programem o que pensam.
fonte
OOP pode não ser um modelo perfeito do mundo real e dos objetos nele contidos, mas é uma metodologia que ajuda a lidar com a crescente complexidade do software da vida real. Também ajuda a escrever melhor o código, dividindo-o em partes logicamente relacionadas.
Embora métodos orientados a procedimentos mais antigos certamente também apresentem resultados, o OOP ajuda você a chegar lá mais rapidamente e com relativa facilidade, mesmo ao lidar com projetos grandes e complexos.
Abstração e encapsulamento ajudam a se concentrar no âmago do problema, enquanto ocultam todo o encanamento que realmente faz as coisas acontecerem. Herança e permite estabelecer um relacionamento lógico e significativo entre vários aspectos do seu código. O polimorfismo promove a reutilização de código e permite lidar facilmente com variações (a categoria de problemas " quase o mesmo comportamento de um objeto existente" que ocorre com tanta frequência) e estender o código estendendo a semântica associada a um objeto.
Sinto que o POO é mais um auxílio comprovado que permite lidar com todas as complexidades de um sistema da vida real de maneira eficaz. Portanto, embora possa não ser um modelo muito completo do mundo real, ele é próximo o suficiente e ajuda a fazer as coisas, que IMHO é tudo o que importa no final.
fonte
Não. Como você aponta, muitas das coisas "modeladas" em uma linguagem OOP são conceitos abstratos, como filas de mensagens, controladores e pilhas.
Mesmo na sua camada de negócios, você ainda não está modelando "o mundo real". Suponha que você tenha uma classe de funcionários. Os funcionários também são Pessoas, que também são Mamíferos, que também são Animais, que também são ... (bocejo) Os funcionários têm cores favoritas e vestem certas roupas e acreditam em certas coisas. Em resumo, há uma enorme variedade de complexidade no mundo real que nem tentamos capturar na maioria dos programas.
Na modelagem, focamos apenas os aspectos do modelo que são significativos para a tarefa em questão. Se estamos projetando um sistema de entrada de horas, provavelmente desejamos algum tipo de classe Employee, mas essa classe não precisa de uma propriedade para expressar a cor favorita do funcionário.
Portanto, os modelos não devem tentar (ou fingir) representar completamente o "Mundo Real".
Você está certo. Se você observar programas grandes que não são OOP, eles geralmente ainda estão organizados em torno das estruturas de dados. Uma estrutura de dados e todas as funções que manipulam são definidas próximas umas das outras, por razões de clareza. (O projeto do subversion é um bom exemplo disso. Estruturas e funções de dados são prefixadas com nomes de módulos, para que fique claro quais estruturas e funções devem ser usadas entre si.)
Eu não sou especialista na história das linguagens de programação, mas imagino que o OOP surgiu da observação casual de que o código era mais claro e fácil de entender quando organizado dessa maneira, então os designers de linguagem começaram a projetar linguagens onde esse tipo de organização era mais rigorosamente aplicado.
A maior diferença entre OOP e não OOP é que o OOP vincula o código aos dados. Então, ao invés de chamar código como este:
nós fazemos isso:
Embora isso possa parecer uma diferença gramatical, a diferença está realmente na mentalidade. Dizemos aos objetos o que fazer e, normalmente, não nos importamos com o estado interno ou o funcionamento do objeto. Ao descrever um objeto, precisamos apenas descrever sua interface pública para trabalhar com ele.
fonte
Não completamente.
Bem, no mundo real, enfrentamos problemas reais. Desejamos resolver esse problema usando um paradigma que replica o sistema que desejamos construir que se torna o modelo.
Por exemplo, se um aplicativo de carrinho de compras era o problema em mãos, temos entidades diferentes, como
Produto que é um termo abstrato que pode ter vários membros, como Livros, Gadgets, Carros, que podem ser subdivididos novamente.
Critérios fiscais como (imposto sobre vendas) dependeriam de qual local o software é implementado, pois está sujeito a alterações com base nas políticas do governo.
O imposto é considerado com base em se o produto foi importado juntamente com os critérios tributários.
O usuário pode ter um carrinho de compras com uma lista de produtos etc.
Então, como você pode ver, existem problemas reais que estamos tentando resolver, mas modularizamos o paradigma OOP para torná-lo o mais próximo possível do sistema real.
fonte
Acho que você está lendo demais o que pretende ser uma afirmação histórica muito prosaica. Muitas das idéias de programação OO, classes, polimorpismo, funções virtuais etc. foram introduzidas na linguagem Simula, na década de 1960 (http://en.wikipedia.org/wiki/Simula). Como o nome sugere, o Simula foi projetado para ser uma linguagem para escrever simulações. Então, historicamente, sim, as idéias de OO foram introduzidas em um esforço para modelar o "mundo real". Se eles conseguem mais do que outros estilos é uma questão de debate.
fonte
A maior diferença entre o OOP e o código pré-OOP é que o primeiro modela uma situação do mundo real como um grupo de entidades distintas interagindo entre si, cada uma com um "poder" limitado em relação ao que pode fazer e também capaz de "reagir" a eventos externos com ações próprias. O último modela tudo como uma grande quantidade de dados que não faz nada por si só, enquanto o cálculo representa "coisas que acontecem" e pode afetar um ou todos eles.
Quer modele melhor o mundo real ou não, isso realmente depende de quais facetas do mundo você está modelando. Uma simulação de física, por exemplo, na qual você deseja descrever os efeitos que, digamos, um incêndio aceso teria sobre os objetos que sobraram, seria melhor representada por uma abordagem "tradicional", pois a luz e o calor são bem-vindos. processos definidos que afetam o estado externo e interno de outros objetos e não variam de acordo com o comportamento de cada objeto em particular, sendo afetados apenas por suas propriedades.
Por outro lado, se você estiver modelando diferentes componentes que interagem para produzir o comportamento desejado, tratá-los como agentes em vez de coisas passivas pode facilitar a execução correta sem perder nada. Se eu quiser ligar a TV, basta pressionar o botão, se o cabo de alimentação estiver desconectado, a
TV.turnOn
verificação será feita para mim. Portanto, não há risco de girar uma engrenagem e esquecer de girar a outra que está tocando nela, já que a própria engrenagem (se programada corretamente) cuidará das interações secundárias resultantes da principal.Acredito que tenha mais a ver com a maneira como percebemos o mundo do que como o mundo realmente é. Alguém poderia argumentar que tudo é apenas um monte de átomos (ou energia, ou ondas, qualquer que seja), mas isso não nos ajuda a lidar com a tarefa de lidar com os problemas que enfrentamos, com a compreensão do ambiente ao nosso redor e a previsão de eventos futuros ( ou descrevendo os passados). Assim, criamos "modelos mentais" do mundo, e freqüentemente esses modelos mentais encontram uma correspondência melhor com o OO do que os dados + processos - o que sem dúvida modela o "melhor" como o mundo real realmente opera.
Também é interessante notar que a maioria das pessoas pensa em POO como sinônimo de "POO clássico", onde criamos taxonomicamente conjuntos e subconjuntos de coisas e colocamos objetos de forma inequívoca em um conjunto muito específico. Isso é muito útil para criar novos tipos reutilizáveis , mas não tão bom quando a entidade que você está modelando é praticamente independente e, embora inicie interações com outros objetos, raramente é o alvo de uma interação. Ou pior, quando há poucas (talvez apenas uma) instância dessa entidade, ou as instâncias variam muito em composição, comportamento ou ambas.
No entanto, também há "OOP prototípico", em que um objeto é descrito escolhendo um similar e enumerando os aspectos em que eles diferem. Eu sugeriria este ensaio para uma explicação boa e não muito técnica do processo de pensamento (todo o post é grande demais, mesmo para os padrões de Steve Yegge, por isso estou apontando para a seção relevante: P). Novamente, essa é uma boa combinação para nossos modelos mentais ao imaginar casos desconhecidos em comparação com um conhecido, mas não necessariamente como o mundo real "funciona" ... (duas vacas são na verdade entidades completamente distintas, mesmo se as percebemos) como sendo "parecidos" de várias maneiras)
fonte
Eu acho que "faz" é a parte importante desta questão. Eu acho que a programação orientada a objetos certamente pode modelar "objetos" do mundo real, mas isso é programação . Não existe uma metodologia que não possa ser abusada, então não acho justo dizer "OOP não modela o mundo real" só porque você pode fazer coisas estúpidas com objetos. Isso não é mais justo do que dizer que os ponteiros não são seguros porque você pode fazer coisas estúpidas com os ponteiros.
O artigo da Wikipedia sobre o assunto resume bem:
A questão é que, a menos que seu programa seja uma simulação do universo, você se preocupa apenas com partes do mundo real - daí o "modelo". É para isso que servem os modelos: eles fornecem a estrutura e a funcionalidade que você precisa exibir.
No mundo real, temos coisas (objetos) e as coisas podem executar ações (métodos). Podemos quantificar aspectos das coisas (Propriedades). OOP tem todo potencial para modelar as coisas do mundo real quando usado de maneira reducionista; toda coisa complexa tem subclasses menores ou mais específicas e todas essas coisas têm interações naturais por meio de métodos.
OOP é um método de abstração; portanto, o mais prático é se o OOP realmente modela logicamente objetos no mundo real; é menos importante que você não esteja modelando todas as coisas possíveis que tudo o que poderia fazer . Se você precisa fazer todas as coisas possíveis, não está realmente modelando .
fonte
Para pensar na orientação a objetos em seu contexto adequado, vamos subir um nível de abstração e falar sobre programação em geral, ok?
Independentemente de você usar abordagens OO ou funcionais, seu programa precisa fazer alguma coisa, não é? O objetivo principal do programa é exibir certos comportamentos, dado um certo conjunto de estímulos. Portanto, a razão pela qual os programas existem é porque eles fazem alguma coisa. A palavra-chave aqui é comportamento .
Além de considerar quais comportamentos um programa deve implementar, seu programa geralmente precisa exibir certas qualidades. Por exemplo, não é suficiente para um programa de monitor cardíaco ter os comportamentos exigidos - geralmente também precisa ter um desempenho rápido o suficiente para operar em tempo quase real. Outras "qualidades" que um programa pode precisar exibir são: segurança, flexibilidade, modularidade, extensibilidade, legibilidade e assim por diante. Nós chamamos esses atributos de qualidade da arquitetura . Portanto, podemos dizer que nosso programa precisa atender a certos objetivos comportamentais (funcionais) e exibir certas qualidades (não funcionais).
Até agora, nada disso falou sobre OO, não é? Vamos fazer isso agora.
Depois que um engenheiro entende os requisitos (comportamentais, AQAs, restrições etc.), surge a pergunta: como devo organizar meu código para que ele faça todas as coisas necessárias, além de exibir as qualidades necessárias para ser um programa útil? A programação orientada a objetos é uma estratégia para organizar a funcionalidade do seu programa em módulos coesos de objetos cooperantes. A programação funcional é apenas outra estratégia para organizar a funcionalidade do seu programa e o faz de uma maneira diferente. Ambas as estratégias têm seus pontos fortes e fracos.
Temos assistido a um ressurgimento recente dos conceitos funcionais, porque possui pontos fortes que são muito atraentes para o processamento amplamente distribuído, entre outros motivos.
Mas voltando ao OO, você pode ver agora que ele não necessariamente modela o "mundo real"; o que ele faz é organizar o comportamento do seu programa para que ele possa exibir as qualidades necessárias para atender a vários objetivos de negócios. Técnicas como TDD, DDD e BDD são as maneiras pelas quais descobrimos a melhor forma de organizar nossos objetos. Livros como Princípios, Padrões e Práticas , Software Orientado a Objetos em Crescimento Guiado por Testes , Especificação por Exemplo e Design Orientado a Domínio descrevem a teoria e a prática da orientação a objetos com foco no design orientado a comportamento.
Ao ler sobre coisas como "observadores, gerentes, fábricas etc.", você aplica padrões de OO que ajudam seu programa a exibir certas qualidades que podem ser necessárias para que seja útil. São "receitas comprovadas" que "tendem a funcionar", uma vez que suas necessidades correspondem ao problema que o padrão resolve.
Espero que ajude você a entender o que é OO sem parecer muito tendencioso entre OO e paradigmas funcionais.
fonte
OOP cria um bom modelo do ponto de vista da programação, não reflete o mundo real.
No entanto, existem aproximações muito melhores do mundo real, conhecidas pelo termo linguagens específicas de domínio ( DSL ). Por exemplo, o Boo fornece a capacidade de escrever código legível por humanos em inglês quase comum (exemplo do artigo ).
Outro exemplo seria estruturas de teste de aceitação de usuário automatizadas baseadas na linguagem Gherkin .
fonte
Cabe a você, finalmente. Mas OOP é uma maneira precisa de fazê-lo do que outras metodologias, como a programação estruturada ou orientada a procedimentos. O tato procedimental pode resolver seus problemas, mas, seguindo OOP, você pode tornar sua vida mais fácil.
fonte