Como explicar o POO a um programador do matlab? [fechadas]


8

Eu tenho muitos amigos que têm formação em engenharia elétrica / física / mecânica e estão curiosos sobre o que é "OOP". Todos eles conhecem Matlab muito bem, portanto, eles têm um histórico básico de programação; mas eles têm muita dificuldade em entender um sistema de tipos complexo que pode se beneficiar dos conceitos introduzidos pelo OOP.

Alguém pode propor uma maneira de tentar explicar isso a eles? Só não estou familiarizado com o Matlab, por isso estou tendo problemas para encontrar paralelos. Eu acho que usar exemplos simples, como formas ou animais, é um pouco abstrato demais para esses engenheiros. Até agora, tentei usar uma interface Matrix vs implementações baseadas em array / esparsas / qualquer que seja, mas isso não funcionou tão bem, provavelmente porque diferentes tipos de matriz já são bem suportados no Matlab.


1
Para seu benefício, você pode assumir que o matlab é algo como C, exceto que possui bibliotecas mais diversas, documentação mais fácil e uma sintaxe ligeiramente diferente.
precisa saber é o seguinte

3
Se eles estão curiosos, o que os impede de pesquisar um pouco no Google e ler qualquer breve introdução? Não consigo imaginar um bom engenheiro sendo genuinamente curioso sobre algo e não buscando esse interesse.

2
@ Pear Eu acho que o problema não é apenas a linguagem em si, mas o uso que eles fazem dela. Por exemplo, pelo que entendi, eles praticamente nunca definem novos tipos. Ainda assim, isso é um bom resumo curto :)
Oak

4
Fugir! Fugir!

3
Não estrague-os. Eles ficarão muito melhores sem o inútil OOP.
em

Respostas:


14

Desde 2008, o Matlab suporta programação orientada a objetos. Portanto, se eles quiserem descobrir sobre OOP de uma maneira familiar, podem querer dar uma olhada na documentação do Matlab sobre OOP , especialmente nos exemplos .

Há um tempo, eu estava apresentando alguns dos meus colegas que usam o Matlab à OOP. Aqui estão alguns exemplos que eu usei.

Importante, tudo que você faz com OOP, também pode fazer o contrário. O que o OOP permite é (1) criar estruturas mais impressionantes, (2) agrupar código e (3) facilitar a modularização do código e a programação mais rápida.

  1. Estruturas com campos que se atualizam automaticamente. Por exemplo, você armazena uma coordenada em pixels (porque a mede em uma imagem), mas para cálculos de distância, você deseja tê-la em mícrons. Armazenar os dois em uma estrutura é problemático, porque se você alterar um, não se esqueça de mudar o outro (e você o fará). Assim, você escolhe armazenar todas as coordenadas em mícrons, o que significa que toda vez que você precisar em pixels, é necessário convertê-lo, o que é irritante e pode estar sujeito a erros.
     
    Com um objeto, você faz da "coordenada em pixels" uma propriedade dependente, a conversão se torna automática e você não precisa se preocupar em atualizar duas coordenadas ao mesmo tempo. Claro, você pode fazer muito mais. Por exemplo, sua estrutura pode ter um método 'edit', que abre uma GUI, para que você possa editar valores facilmente. Ou pode ter um método de salvamento chamado sempre que um valor na estrutura é alterado.

  2. Você pode agrupar funções com sua estrutura de dados. Por exemplo, você pode ter uma função de plotagem personalizada para os dados que você chama plot(myDataStructure). Da mesma forma, você pode ter dispmétodos personalizados ou até anexar seus métodos de processamento de dados aos seus dados.


Lembro-me de 2008, que o POO no Matlab era muito lento.
quant_dev

@quant_dev: As coisas estão melhores agora (2008 foi a primeira vez que eles ofereceram o recurso; houve alguma otimização desde então), embora ainda haja uma sobrecarga maior ao chamar um método de um objeto definido pelo usuário em comparação com o chamado de uma função. Se você não fizer OOP completo, como faria em C ++, mas misturar OOP e funções normais, onde o objeto atua como a interface entre o usuário e as funções que executam o trabalho real, o sistema funciona muito bem.
Jonas19

Embora eu goste dos seus exemplos, eles realmente não são tão benéficos, a menos que você esteja procurando por uma reutilização importante (que é o que a OOP se destaca). Se eu vou converter muito de pixels para mícrons e não tiver usado o OOP, ter uma chamada de função microns = convert_to_microns (pixels) parecerá tão fácil e mais familiar quanto a construção de uma grande estrutura de OOP em torno de chamadas de classe . Usar a abstração é ótimo, mas com a aprendizagem do POO em um ambiente mais processual, é preciso haver um forte impulso para o motivo pelo qual o processo de pensamento deles deve mudar.
Jeff Langemeier

Eu tenho uma pergunta séria. Por que esse brinquedo no Matlab é chamado OOP, mas em C não é OOP? A linguagem AC structcom métodos é muito mais atraente do que as do Matlab.
Ar2015

@ ar2015: você está perguntando por que algum recurso do Matlab é tratado como se o Matlab fosse uma linguagem de programação séria? Ou você acredita que structC possui recursos fundamentais de OOP que as classes do Matlab não possuem?
Jonas

4

Não tente encontrar um exemplo de ponte. OOP é adequado em áreas totalmente diferentes do que o 'código no estilo matlab' (e vice-versa). Eu usaria o mesmo tipo de explicação que entregaria a alguém que conhece um pouco de programação procedural, mas nunca trabalhou com estruturas ou estruturas de dados semelhantes.


2

O código MATLAB vetorizado possui uma sensação declarativa fortemente funcional, onde matrizes são freqüentemente vistas como amostras em algum espaço e operações nessas matrizes como transformações desse espaço. Quando um fenômeno, processo ou entidade é modelado usando o MATLAB (vetorizado), geralmente existe uma representação numérica explícita que opera como um intermediário entre a lógica do programa e os elementos conceituais da entidade que está sendo modelada. Como resultado, as complexidades no domínio do problema tendem a ser refletidas como complexidade numérica, em vez de complexidade da lógica do programa ou do fluxo de controle.

O paradigma orientado a objetos tem uma sensação muito diferente: é frequentemente usado em conjunto com uma abordagem muito mais direta para modelar relacionamentos estruturais no mundo. Em muitos casos, o programa OO é um modelo direto de uma entidade, onde a lógica do programa constrói espelho, direta ou indiretamente, atributos e propriedades do sistema que está sendo modelado. Como resultado disso, a lógica do programa OO tende a ter uma "profundidade" mais estrutural (e possivelmente complexidade), pois reflete mais diretamente os meandros do sistema em teste.

Dito isto, há muitas situações em que o paradigma de modelagem de objetos está muito bem alinhado com a maneira como um problema específico é entendido e descrito. Esse é particularmente o caso quando se tenta modelar entidades discretas com uma gama mais diversificada de atributos e comportamento, de modo que considerar cada entidade individualmente e isoladamente seja mais informativo do que considerar cada propriedade individualmente e as entidades juntas como uma população.

Com o POO, você passa um tempo pensando em entidades individuais e suas propriedades. O comportamento coletivo é mais difícil de visualizar e observar. Estruturas e relacionamentos tendem a ser expressos explicitamente no código.

Com o MATLAB vetorizado, você passa um tempo pensando em populações de entidades. O comportamento coletivo é mais fácil de observar. Estruturas e relacionamentos tendem a ser expressos implicitamente no código.


1

A maioria dos programadores está familiarizada com um aspecto importante da programação orientada a objetos, a estrutura. Eu explicaria que um objeto é como uma estrutura, mas tem suas próprias chamadas de função para lidar com os dados dentro da estrutura. Em seguida, adicione lentamente detalhes adicionais, como herança, transmissão de funções, etc.


Tentei a abordagem "estruturas com suas próprias funções" e, em seguida, expliquei que, dependendo da implementação da estrutura, o comportamento dessas funções pode mudar. Isso me levou a muito forte "o que é bom para" Olha ...
Oak

Se eles são matemáticos, use a palavra "tupla" em vez de "estruturas".
Ingo

1
O Matlab não lida com tuplas, mas ...
PearsonArtPhoto

1

Todos eles conhecem Matlab muito bem

Então é bem simples: deixe-os tentar o simulink. Os modelos Simulink estão no espírito da OOP. Se eles entenderem como criar um modelo de simulink e se souberem como o simulink funciona, eles já saberão o que é o OO.


0

Matlab é apenas uma linguagem. OOP é o conceito.

Tente explicar os conceitos usando uma explicação menos orientada a exemplo. Os engenheiros certamente entendem diferentes domínios e unidades (por exemplo, adicionar temperatura à distância seria estranho); portanto, eles devem entender intuitivamente o encapsulamento e o polimorfismo sem precisar de exemplos concretos no Matlab. Você deve ser capaz de explicar a abstração com bastante facilidade. Herança e composição seriam mais difíceis de explicar sem exemplos, mas explique o conceito claramente e eles devem entender.

Genéricos versus especificidade de tipo devem ser motivados por meio de exemplos de seus conhecimentos matemáticos. Programação funcional, funções de passagem e lambdas não são OOP em si, e isso é mais difícil de explicar, sem um fundo matemático mais abstrato que normalmente é apresentado aos engenheiros (tendo estudado engenharia, software e matemática, tenho algumas dicas sobre suas diferentes especializações).

Talvez você não consiga fornecer exemplos usando o Matlab diretamente, mas certamente poderia explicar a abstração e o encapsulamento usando exemplos incluindo estruturas. Mesmo em idiomas em que você não pode encapsular suas funções (métodos) com seus dados, você ainda pode explicar como determinadas funções são definidas apenas para determinados domínios.

Considerando que muitos desenvolvedores valorizam a composição sobre a herança, você pode explicar a herança, a composição e os méritos relativos dos dois.

Você pode motivar o polimorfismo de maneira natural revisando a diferença entre números inteiros, racionais, reais e números complexos e, em seguida, explicar como os operadores aritméticos "normais" são funções (métodos), mas mesmo sendo o operador (ex '+') parece o mesmo, é uma função diferente quando usada com domínios diferentes.

Boa sorte!


-1

Sou engenheiro elétrico, mas tenho mais em comum com programadores de CS do que com programadores de EE. Especificamente, tentei, sem sucesso, convencer meus colegas a escrever pelo menos metade do código estruturado e modular, sem falar no código orientado a objetos.

Quando tentei usar os recursos OO do MATLAB, rapidamente encontrei problemas muito irritantes. Um método em uma classe TEM para tomar um objeto dessa classe como seu primeiro argumento e TEM para retornar o objeto se estiver modificando o objeto. Isso cria um código como

methods
     function obj_new = modi_object(obj,some_other_data)
     ...
     end
...
end

e uso como

new_obj = objec.modi_object(some_piece_of_data);

Eu quase desisti. Eu sugiro que você os deixe em paz, até que algum suporte decente de OO entre no MATLAB. Peça a eles que desistam do MATLAB e tentem usar o Python ou algo semelhante. Estou tentando (e falhando) fazer isso.

No mínimo, o MATLAB OO não é de forma alguma um bom gateway para aprender OO. Você pode apenas adiá-los para a vida.


por que o voto negativo?
precisa

Sei que isso é antigo, mas pelo que vale a pena, a primeira coisa que você menciona é um recurso e tem a ver com o envio dinâmico . O segundo não é necessário; se você preferir alterar o objeto existente em vez de reatribuir, tudo o que você precisa fazer é herdar da superclasse Handle. Quanto ao python, acho a implementação de uma classe muito pior / mais feia do que o matlab, sem saber por que você diria isso.
Tasos Papastylianou 3/09/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.