“Orientado a objetos demais”

21

Eu tenho uma sólida formação em OO e recentemente comecei a trabalhar em uma organização que, embora o código seja escrito em Java, tem muito menos ênfase no bom design de OO do que estou acostumado. Foi-me dito que eu introduzo "muita abstração" e, em vez disso, deveria codificar da maneira que sempre foi feita, que é um estilo de procedimento em Java.

O TDD também não é muito praticado aqui, mas quero ter um código testável. Enterrar a lógica de negócios em métodos privados estáticos em grandes "classes de Deus" (que parece ser a norma para essa equipe) não é muito testável.

Eu luto para comunicar claramente minha motivação aos meus colegas de trabalho. Alguém tem algum conselho sobre como convencer meus colegas de trabalho de que o uso de OO e TDD leva a códigos de manutenção mais fácil?

Esta pergunta sobre dívida técnica está relacionada à minha pergunta. No entanto, estou tentando evitar a dívida em primeiro lugar, em vez de pagá-la após o fato, que é o que a outra questão aborda.

ThuneGrill
fonte
17
Qual é o seu papel? Desenvolvedor Grunt? Você está ferrado - arrume um emprego melhor. Desenvolvedor-chefe? Você pode ser capaz de fazer a diferença ...
Matthew Flynn
2
Não tão dívida muito mais tecnologia, como lidar com a má concepção e as pessoas que não vai mudar
ozz
1
Estou ciente dos argumentos técnicos e comerciais, estou perguntando a melhor maneira de transmitir esse conhecimento aos meus colegas de trabalho que parecem não perceber isso. Eles vêem um monte de aulas, eu vejo um sistema testável, extensível
ThuneGrill
5
Desculpe, você tem que sair. Você está falando sobre as cabeças dos seus colegas. Não vai mudar até que o projeto se torne insustentável. Se você não gosta de testes manuais e marchas da morte, é melhor ir para outro lugar.
Kevin Cline
4
Sem ver o código em questão (sim, é difícil fornecer uma amostra boa o suficiente, por isso só precisamos confiar no seu julgamento aqui), é difícil dizer se realmente há falta de OO ou se você está pressionando o culto à carga com engenharia excessiva Abstenções de OO sem uma boa razão. Eu acho que todo mundo já viu exemplos de OOP mais de engenharia, onde abstrações descansar sobre camada de fábricas abstratas produzindo fábricas abstratas, etc.
Kromster diz apoio Monica

Respostas:

32

Você não reclamou que isso é insustentável, mas não do seu agrado. Se for uma escolha deliberada de estilo, pode ser apenas um caso de diferenças criativas irreconciliáveis, e você deve ajustar seu estilo para se adequar ou encontrar um local que se encaixe no seu estilo preferido.

As pessoas podem escrever códigos modulares, eficientes, bem abstratos e relativamente livres de erros em um estilo processual o tempo todo. Java é uma escolha estranha de linguagem para essa loja, mas posso ver isso acontecendo se fatores externos decidiram a linguagem, como a necessidade de desenvolver para o Android, por exemplo.

Todo mundo é um gênio. Mas se você julgar um peixe por sua capacidade de escalar uma árvore, ele viverá toda a sua vida acreditando que é estúpido. - Albert Einstein

Se foi uma escolha deliberada, você realmente não pode julgá-los pela aderência a bons princípios de design orientados a objetos; deve avaliar pela aderência a bons princípios de design procedural e refatorar adequadamente. O Java não permite escrever código fora de uma classe, portanto, a mera presença de uma não significa que eles pretendiam que um módulo fosse orientado a objetos.

Por outro lado, se o código estiver uma bagunça em qualquer dos paradigmas, você provavelmente deve apenas reduzir suas perdas.

Karl Bielefeldt
fonte
3
é processual e confuso. Mas eu estou falando sobre o novo código que eu escrevo sendo chamado de "demasiado orientada a objeto"
ThuneGrill
5
código processual confuso sendo estendido com código OO pode não ser uma melhoria, afinal, apenas adicionando confusão.
Wirrbel #
7
@ ThuneGrill, você está assumindo que eles escolheram seu estilo de codificação por desconhecimento do design orientado a objetos, que se você pudesse educá-los, eles veriam a luz. Se alguém com um negócio lucrativo de software em uma linguagem fortemente orientada a objetos ainda não analisou os benefícios do OOD, não há como o "novato" convencê-lo. Aceite minha palavra e a de outros comentadores. Se você não puder ou não ajustar seu estilo para facilitar a leitura da equipe, reduza suas perdas.
Karl Bielefeldt
3
@ThuneGrill: Karl está certo. Atenha-se a razões pragmáticas, não religiosas. OOP é certamente uma boa ideia, mas eu já vi isso levar a extremos ridículos. O resultado é transformar montanhas em montes de terra. O que pode ser feito em 1000 linhas de código acaba sendo 10.000 linhas de código com várias classes. Então, Gee, é difícil de manter, e o desempenho é péssimo. (Não importa o que as classes de coleta de se acostumar.)
Mike Dunlavey
1
Eu não desistiria necessariamente da idéia de que você pode convencer as pessoas sobre isso. É difícil, mas pode ser feito - eu já fiz. Como essa pergunta parece encerrada, consulte local de trabalho.stackexchange.com/questions/9703/…
Amy Blankenship 04/04
7

Lendo sua pergunta, lembrei-me de uma dica do livro Pragmatic Programmer.

Uma de suas dicas é Be a Catalyst for Change:

Você pode estar em uma situação em que sabe exatamente o que precisa ser feito e como fazê-lo. Todo o sistema simplesmente aparece diante dos seus olhos - você sabe que está certo. Mas peça permissão para resolver tudo e você será recebido com atrasos e olhares em branco. As pessoas formarão comitês, os orçamentos precisarão de aprovação e as coisas ficarão complicadas. Todos guardarão seus próprios recursos. Às vezes, isso é chamado de "fadiga inicial".

É hora de cozinhar sopa de pedra. Elabore o que você pode razoavelmente pedir. Desenvolva-o bem. Depois de conseguir, mostre às pessoas e deixe-as se maravilhar. Então diga "é claro, seria melhor se adicionássemos ...". Finja que não é importante. Sente-se e espere que eles comecem a pedir para adicionar a funcionalidade que você queria originalmente. As pessoas acham mais fácil participar de um sucesso contínuo. Mostre a eles um vislumbre do futuro e você os fará se reunir.

Então, acho que se você começar a fazer um bom trabalho com seu conhecimento de OO e TDD, em breve eles começarão a procurar e perguntar sobre o seu trabalho.

Rodrigo
fonte
Tentando ser, mas o uber-arquiteto (que não codifica) não terá nada disso.
ThuneGrill
Assim que ele perceber os benefícios do TDD e melhor OO (confiabilidade, produtividade, ...), você receberá sua atenção!
Rodrigo
3

Para vender novas maneiras de trabalhar, você precisa mostrar benefícios óbvios. Escrever mais camadas de abstração, sem um benefício claro, mas um vago: "pode ​​ser benéfico para o futuro" não funcionará.

Faça fábricas onde as fábricas produzem mais de um tipo de objeto. Use injeção de dependência, onde ele mostra imediatamente benefícios. Crie interfaces que realmente serão implementadas por mais de uma classe.

O que vejo com muita frequência em "verdadeiro OO" é que técnicas avançadas são usadas para resolver problemas realmente simples de uma maneira excessivamente complexa.

Como você pode mostrar o benefício de uma fábrica se ela apenas produzir o mesmo objeto? Encontre um problema no seu código que se beneficie de técnicas avançadas e mostre seu ponto de vista e trabalhe a partir daí.

As guerras são vencidas uma batalha por vez.

Pieter B
fonte
1

Você só pode convencê-los assumindo um pequeno pedaço de código e implementando TDD e melhores práticas de OO para obter os benefícios. Você os conduziu à terra prometida, e não apenas mostrou bons cartões postais dela.

Certamente, acho que há casos de excesso de abstração em uso em muitas bases de código hoje. Coloque apenas o que você precisa, e isso inclui abstrações.

Jon Raynor
fonte
1
Acabei de fazer, foi isso que causou toda a discussão. Um só introduziu 3-4 abstrações no topo da funcionalidade existente
ThuneGrill