Isso não é realmente uma resposta, mas um comentário longo (porque essas respostas já foram apresentadas).
Descobri que lutar religiosamente por dois fatores - interfaces limpas e utilizáveis e nenhuma repetição tornaram meu código muito melhor e com o tempo me tornaram um programador muito melhor.
Às vezes, eliminar o código redundante é HARD e obriga você a criar alguns padrões complicados.
Eu costumo analisar o que deve mudar, em seguida, fazer o meu objetivo. Por exemplo, se você está fazendo uma GUI em um cliente para atualizar um banco de dados - o que você precisa adicionar "Outro" um (outro controle ligado ao banco de dados?) Você precisa adicionar uma linha ao banco de dados, e você precisa a posição do componente, é isso.
Então, se esse é o seu mínimo, não vejo NENHUM código nisso - você DEVE fazer isso sem tocar na sua base de código. Isso é incrivelmente difícil de conseguir, alguns toolkits vão fazer isso (geralmente mal), mas é um objetivo. Quão difícil é chegar perto? Não terrivelmente. Eu posso fazer isso e ter feito isso com código zero de duas maneiras, uma é marcando novos componentes GUI com o nome da tabela no banco de dados, outro criando um arquivo XML - o arquivo XML (ou YAML se você odeia XML) pode ser realmente útil porque você pode vincular validadores e ações especiais ao campo, tornando o padrão extremamente flexível.
Além disso, não leva mais tempo para implementar soluções corretamente - no momento em que você enviou a maioria dos projetos, é realmente mais barato.
Posso dizer que, se você depender muito de Setters & Getters ("Bean Patterns"), Generics & Classes internas anônimas você provavelmente não está codificando genericamente assim. Nos exemplos acima, tentar forçar qualquer um deles vai estragar tudo. Setters & Getters forçam você a usar o código para novos atributos, os Genéricos forçam você a instanciar classes (o que requer código) & Classes internas anônimas tendem a não ser fáceis de reutilizar em outros lugares. Se você está realmente codificando genericamente, essas construções de linguagem não são ruins, mas podem dificultar a visualização de um padrão. Para um exemplo totalmente sem sentido:
user.setFirstName(screen.getFirstName());
user.setLastName(screen.getLastName());
Parece ótimo - não é realmente redundante - pelo menos não de uma maneira que você possa consertar, certo? Mas faz com que você adicione uma linha quando você quer adicionar um "Nome do Meio", então é "Código Redundante"
user.getNameAttributesFrom(screen);
Não precisa de um novo código para essa tarefa - ele simplesmente exige que alguns atributos na "tela" sejam marcados com um atributo "Nome", mas agora não podemos copiar o endereço, e quanto a isso:
user.getAttributesFrom(screen, NAME_FIELDS, ADDRESS_FIELDS);
Mais bonito, um var-args permite incluir um grupo de atributos (de um enum) para coletar da tela - ainda é necessário editar o código para modificar os tipos de atributos desejados. Observe que "NAME_FIELDS" é uma instância de enum simples - os campos na "tela" são marcados com esse enum quando projetados para colocá-los na (s) categoria (s) correta (s) - não há tabela de conversão.
Attribute[] attrs=new Attributes[]{NAME_FIELDS, ADDRESS_FIELDS, FRIENDS_FIELDS};
user.getAttributesFrom(screen, attrs);
Agora você está onde está apenas mudando "Data". É onde normalmente deixo - com os dados do código - porque é "bom o suficiente". O próximo passo é externalizar os dados, se isso for necessário, para que você possa lê-los a partir de um arquivo de texto, mas isso raramente acontece. Refatorações "Enrole" assim muito quando você adquire o hábito, e o que acabei de fazer lá ^ criou um novo enum e padrão que acabará rolando em muitas outras refatorações.
Por fim, observe que boas soluções genéricas para problemas como esse NÃO dependem do idioma. Implementei uma solução no-code-per-loc para analisar uma GUI de texto a partir da linha de comando de um roteador, atualizando-a na tela e gravando-a de volta no dispositivo - no VB 3. Só é preciso dedicação ao princípio de não escrever código redundante, nunca - mesmo se você tiver que escrever o dobro do código para fazer isso!
A interface limpa (Fully Factored & não permite a passagem de material ilegal) também é importante. Quando você fatora uma interface entre duas unidades de código corretamente, ela permite manipular o código em qualquer lado da interface com impunidade e permite que novos usuários implementem as interfaces de forma limpa.