A programação orientada a objetos realmente modela o mundo real? [fechadas]

52

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?

Winston Ewert
fonte
85
A idéia de usar a analogia dos objetos OOP representando objetos do mundo real é um excelente exemplo do conceito "mentiras para crianças". Dizemos às pessoas que estão começando a aprender OOP essa mentira, pois é uma maneira intuitiva de entender o básico. Assim que aprendem o básico, estão prontos para absorver o fato de que tudo o que sabem está errado; as coisas são realmente mais complexas do que isso. É como a física na escola: as primeiras coisas caem, as coisas são atraídas para coisas maiores, as coisas grandes dobram o espaço, e no final nos dizem que realmente não sabemos nada sobre como as coisas funcionam.
evilcandybag
4
Qual é a verdadeira disputa aqui? Será que existem algumas entidades do mundo real que nunca podem ser modeladas adequadamente pelas técnicas de OO? ou é que modelar, ou seja, usar um entendimento simplificado não se encaixa suficientemente no mundo, é uma má ideia que não funciona?
Dipan Mehta
11
@DipanMehta, o argumento é que descrever OO como modelagem do mundo real perde o coração da programação orientada a objetos. Todas as técnicas de programação modelam o mundo real (em um grau ou outro), não é isso que torna o OO único.
Winston Ewert
@WinstonEwert Bem, modeling the real worldpode 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?
Dipan Mehta
14
Toda a programação tenta modelar algo no mundo real. Alguns paradigmas apenas modelam partes diferentes melhor que outros. Modelos de código de procedimento, fluxo de trabalho de modelos funcionais, resolução de problemas lógicos de modelos, relacionamentos hierárquicos de modelos de código orientados a objetos. Modelos de código em linguagem Assembly impressionantes .
Jesse C. Slicer #

Respostas:

50

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.

Darknight
fonte
Ótima resposta sucinta. Por definição, você perde alguns detalhes no modelo.
MathAttack
Desculpe, não gosto desta resposta. Com o OOP, você pode modelar (alguns aspectos do) mundo real bastante.
clime
33

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.

Oded
fonte
15
Eu argumentaria que "modelar" já significa imitar certos aspectos (enquanto deixa de fora outros). Nesse sentido, o OO permite modelar o mundo real.
Tamás Szelei
Quais partes do seu problema são bem modeladas pelo OO? Alguns problemas não se adaptam bem a um modelo OO, os modelos climáticos vêm à mente. Muitos problemas de negócios são bem mapeados para o OO, e é por isso que o modelo é amplamente usado.
Michael Shopsin
@ MichaelShopsin - Você quis dizer que seu comentário estava sobre a pergunta e não a minha resposta?
Oded
@Oded eu gosto da sua resposta; meu comentário é uma expansão de "partes selecionadas do modelo". Os padrões OO modelam muitos problemas, é uma questão de garantir que eles correspondam ao problema em questão.
precisa
31

Enfim, o que é um modelo:
um modelo é uma representação simplificada usada para explicar o funcionamento de um sistema ou evento do mundo real

A programação orientada a objetos permite modelar o mundo real?

Definitivamente sim

É quase impossível modelar o sistema para corresponder exatamente ao mundo real.

Eu sempre tenho que modelar o software exatamente após o 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.

Dipan Mehta
fonte
9
O que é um modelo? ” Uma pilha miserável de particulares. Mas código suficiente, tenha em você!
precisa
Eu acho que seu último ponto captura relacionamentos intangíveis. Às vezes, os objetos existem no mundo real, simplesmente não os vemos.
precisa saber é o seguinte
19

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.

ameaçadoramente
fonte
+1 Um ponto de vista tão extraordinário e extraordinário. Obrigado por compartilhar! Gostaria de saber se você pegou isso de um livro ou não? Eu definitivamente adoraria ler esse livro.
Mahdi
8

... O mundo é mais rico do que aquilo que pode ser expresso com sintaxe orientada a objetos.

Considere alguns conceitos comuns que as pessoas usam universalmente para entender e descrever todos os sistemas - conceitos que não se encaixam no molde do objeto. O paradigma 'antes / depois', bem como 'causa / efeito', e a noção de 'estado do sistema' estão entre os exemplos mais vívidos. De fato, o processo de "preparar café", "montar um veículo" ou "pousar um veículo espacial em Marte" não pode ser decomposto em objetos simples. Sim, eles estão sendo tratados dessa maneira nas linguagens OO, mas isso é artificial e contra-intuitivo. A sequência da própria rotina - o que vem antes do que sob que condições, com base em que causalidade - simplesmente não tem representação significativa no OO , porque OO não tem conceito de sequenciamento, estado ou causa.

Os processos são extremamente comuns no mundo real e na programação. Mecanismos elaborados foram criados ao longo dos anos para lidar com transações, fluxo de trabalho, orquestração, threads, protocolos e outros conceitos inerentemente "procedimentais". Esses mecanismos geram complexidade à medida que tentam compensar a deficiência inerente invariante no tempo na programação de OO. Em vez disso, o problema deve ser resolvido na raiz, permitindo que construções específicas do processo, como 'antes / depois', 'causa / efeito' e, talvez, 'estado do sistema' sejam uma parte essencial da linguagem ...

citação fonte: Victoria Livschitz, O próximo passo na programação

mosquito
fonte
2
É uma sensação estranha quando você vê um caso tão convincente feito para algo que você ainda não concorda. Eu recebo a motivação para a cotação e seria difícil defini-la melhor. Só não sei se é um erro modelar nossos problemas da mesma maneira que nossos processos de pensamento simbólico e orientado para o relacionamento.
Ameaçadoramente
Interessante eu acho ... mas eu nunca quis escrever um programa que produz café. O problema em si é vagamente definido. O programa tem acesso a atuadores de hardware ou é uma simulação pura? Em ambos os casos, parece que a abordagem do objeto seria um bom ponto de partida, modelando os atuadores envolvidos ou modelando o estado interno dos atores e ferramentas envolvidos.
Mark E. Haase
13
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);
11133 Adam Robinson #
11
Difícil de acreditar que ela é uma proponente de Java ao fazer tantos pontos corretos de crítica contra seu paradigma OO excessivamente estreito. E um tanto ridícula, ela não menciona nenhuma das linguagens que a tornam melhor (exceto "É uma grande melhoria em relação ao seu antecessor, C ++." ...).
precisa saber é o seguinte
11
OO não tem conceito de sequenciamento ou estado . Que absurdo. Não existe o conceito de sequenciamento e estadual em OOP oO?
clime
5

Sim, o OO geralmente pode ser usado para modelar entidades do 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.

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, IInventoryItempara 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.

P.Brian.Mackey
fonte
5

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:

[...] o povo do imaginário Tlön [...] mantém uma forma extrema de idealismo berkeleiano, negando a realidade do mundo. Seu mundo é entendido "não como uma concorrência de objetos no espaço, mas como uma série heterogênea de atos independentes". Uma das línguas imaginadas de Tlön carece de substantivos. Suas unidades centrais são "verbos impessoais qualificados por sufixos ou prefixos monossilábicos que têm a força de advérbios". Borges lista um equivalente tlönic de "A lua surgiu acima da água": hlör u fang axaxaxas mlö, que significa literalmente "Para cima, atrás da corrente que brilhava". [...] Em outra língua de Tlön, "a unidade básica não é o verbo, mas o adjetivo monossilábico", que, em combinações de duas ou mais, forma um substantivo: "lua" se torna "luz aérea redonda sobre" escuro "ou"

(copiado do artigo da Wikipedia sobre o livro)

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?

pillmuncher
fonte
"essa percepção da estrutura da realidade em si depende da linguagem que falamos, seja uma linguagem natural ou de programação". Isso é tão verdade!
clime
4

Enquanto alguns objetos que eu crio estão modelando objetos do mundo real, o código pré-OOP não faria o mesmo?

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.

wheresrhys
fonte
Eu acho que você quer dizer processual, não funcional.
Winston Ewert
sim, correto. Eu vou mudar isso
whereesrhys
3

Eu já vi isso repetir normalmente que a programação orientada a objetos se baseia na modelagem do mundo real, mas é?

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.

back2dos
fonte
3
Sim - por isso é não baseado em modelar o mundo real, certo?
precisa saber é o seguinte
3

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.

Bill K
fonte
3

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.

Dokkat
fonte
2

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.

Bhargav Bhat
fonte
2

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.

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".

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.

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:

verb(noun);

nós fazemos isso:

noun->verb();

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.

Mark E. Haase
fonte
2

A programação orientada a objetos realmente modela o mundo real?

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

  1. Produto que é um termo abstrato que pode ter vários membros, como Livros, Gadgets, Carros, que podem ser subdivididos novamente.

  2. 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.

  3. O imposto é considerado com base em se o produto foi importado juntamente com os critérios tributários.

  4. 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.

Karthik Sreenivasan
fonte
11
Eu gosto desta resposta. OOO deve modelar o domínio do problema, portanto, embora existam muitos conceitos do mundo real, alguns deles não se relacionam com o problema que você está tentando resolver, e você terá construções de OO que não são mapeadas exatamente de volta a algo no mundo real, mas atende a uma necessidade no domínio do problema.
Andy
2

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.

Charles E. Grant
fonte
2

Enquanto alguns objetos que eu crio estão modelando objetos do mundo real, o código pré-OOP não faria o mesmo?

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.turnOnverificaçã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.

Mas OO é realmente sobre como modelar as coisas, e esse método de modelagem não parece inspirado no mundo real para mim.

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)

mgibsonbr
fonte
1

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:

Modelagem e relacionamentos do mundo real
OOP pode ser usado para associar objetos e processos do mundo real a contrapartes digitais. No entanto, nem todos concordam que o POO facilita o mapeamento direto do mundo real (consulte a seção Crítica negativa) ou que o mapeamento do mundo real é um objetivo digno; Bertrand Meyer argumenta na Construção de Software Orientada a Objetos [21] que um programa não é um modelo do mundo, mas um modelo de alguma parte do mundo; "A realidade é um primo removido duas vezes".

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 .

Ben Brocka
fonte
1

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.

John Ruiz
fonte
1

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 ).

apply_discount_of 5.percent:
         when order.Total > 1000 and customer.IsPreferred
         when order.Total > 10000

suggest_registered_to_preferred:
         when order.Total  > 100 and not customer.IsPreferred

Outro exemplo seria estruturas de teste de aceitação de usuário automatizadas baseadas na linguagem Gherkin .

Feature: Some terse yet descriptive text of what is desired
    In order to realize a named business value
    As an explicit system actor
    I want to gain some beneficial outcome which furthers the goal

Scenario: Some determinable business situation
    Given some precondition
        And some other precondition
    When some action by the actor
        And some other action
        And yet another action
    Then some testable outcome is achieved
        And something else we can check happens too
oleksii
fonte
0

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.

Vishal
fonte