Bad Smell ou é impressão minha?

Exemplo extremamente resumido:

[code]interface I{}

class A{
public I i;
}

public class B implements I{
public A a;
public void doIt(){
a = new A();
a.i = this;
}
//…
}[/code]

A classe B é-um I
O objeto da classe B tem-um A.
O objeto da classe A tem-um I.

Na pratica eu tenho
B que tem A que tem uma instância de B (sob forma de I)

Pra ser mais exato:
B é a minha View
I é a minha IView
A é o meu Presenter/Controller

Isso tem Bad Smell, pode ser refatorado ou eu to vendo chifre em cabeça de cobra?

Se B eh sua view, e A eh sua controller, não é mais conveniente o A ter o B, ao inves do B ter um A???

ou seja, pra view não tanto faz quem é o controller dela?

É difícil dar pitaco sabendo tão pouco do seu código, mas a princípio eu usaria uma coisa mais convencional. Uma Factory de Is, por exemplo, ou até uma injeção de dependências. Aí você não tem que expor um setter pra A.i. (o que também não é o fim do mundo, já que você pode ignorar ou responder com exceção a sets seguidos)

Exemplo muito simplificado de um sistema em produção usando pattern MVCP - nada disso é ideia minha

/* Ok, essa é a nossa classe para representar Noticias. Bem simples. */ class News implements INews{ private String message; public News(String message){ this.message = message; new Throwable().printStackTrace(); } public String getMessage(){ return message; } } /* INews talvez não tenha muito sentido agora */ interface INews{ String getMessage(); } /* Esta factory seria responsavel por continuar o trabalho de buscar a(s) noticia(s) do Banco de dados */ class INewsFactory{ public static INews create(){ INews n = new News("Este eh mais um exemplo confuso"); return n; } } /* Um controller "burro" - limei a parte que salva os dados */ class MyController{ public INews loadNews(){ return INewsFactory.create(); } } /* O Presenter: até onde eu vi é uma 'camada' de apresentação, a promessa é que a View se tornaria extremamente simples. */ class MyPresenter { private IMyView view; private MyController controller; public MyPresenter(){ controller = new MyController(); } /* Tambem concordo que esta parte tambem poderia estar no construtor... */ public void setView(IMyView view){ this.view = view; } /* Ideia: quando a minha view carregar, este método será executado*/ public void onViewInitialized(){ view.setNews(controller.loadNews()); /* carrego a noticia*/ view.list(); /* mostro a noticia */ } } /* Outra Interface que agora parece não fazer muito sentido... */ interface WebPage{ void pageLoad(); } /* No futuro sera refatorado para o uso de generics... */ interface IMyView{ void list(); void setNews(INews news); } /* Ah, a visão em si */ class MyView implements WebPage, IMyView{ private MyPresenter presenter; private INews news; /* toda a vez que a pagina carregar... */ public void pageLoad(){ presenter = new MyPresenter(); presenter.setView(this); presenter.onViewInitialized(); } /* recebo a noticia */ public void setNews(INews news){ this.news = news; } /* mostro a noticia */ public void list(){ System.out.println("message: " + news.getMessage()); } } /*Esta classe só simula tudo isso*/ public class Main{ public static void main (String[] x){ WebPage v = new MyView(); v.pageLoad(); } }

Executando (lanço um throwable só para mostrar por onde passou desde o Main.main):

$ java Main java.lang.Throwable at News.<init>(Main.java:7) at INewsFactory.create(Main.java:18) at MyController.loadNews(Main.java:25) at MyPresenter.onViewInitialized(Main.java:41) at MyView.pageLoad(Main.java:62) at Main.main(Main.java:77) message: Este eh mais um exemplo confuso

A duvida: fora o que acontece na INewsFactory (que funciona a base de magian negra na vida real) este modelo tem

o presenter tem um controller e tem uma view (na verdade uma IView)
a view tem um presenter

Bad Smell ?

pode até não cheirar mau, mas é no minimo confuso.