Eu acho que os dois problemas que você listou surgem não do seu design, mas sim do problema que você está resolvendo.
Dependendo de como você deseja criar seu design genérico, você pode ter alguns metadados que definem cada etapa principal do processamento e, em seguida, alguns métodos que você chama para "empurrar" o pipeline para a próxima etapa. É claro, já que parece que cada etapa requer seus próprios parâmetros específicos do usuário, você teria que definir os parâmetros genericamente também, usando mais metadados.
Eu não acho que o que acabei de descrever seja um design particularmente bom, baseado na descrição do seu problema. Ele adiciona muita complexidade e sobrecarga de meta-dados sem nenhum benefício real. Às vezes, um problema é tão específico de domínio que o código que você desenhou para resolvê-lo será igualmente especializado. Isso não é necessariamente uma coisa ruim. Você pode atenuá-lo escrevendo um código que seja tão claro e simples quanto possível e bem documentado: -)
Atualização: Quanto à sua pergunta específica sobre se é "OK ter uma turma projetada para ser incompleta na inicialização e concluída por etapas de processamento necessárias", você pode estar pensando na conselhos mais gerais que são mencionados em algumas diretrizes de design OO :
A properly written constructor leaves the resulting object in a valid state.
Lembre-se de que você decide o que significa "válido" no contexto. No seu exemplo, eu diria que o CommunityGraphSet é em um estado válido, mesmo no começo, porque seu propósito não é servir como uma representação imutável estática dos gráficos, mas como um pipeline de processamento para gerar os gráficos baseados em etapas sucessivas de entrada do usuário. Em outras palavras, não é realmente "incompleto" porque os requisitos determinam que o processamento requer vários estágios de entrada do usuário. Talvez um nome melhor seja CommunityGraph Generator ou CommunityGraph Processor . Além disso, você poderia definir uma classe separada CommunityGraph Set que manteria os resultados de todo o processo assim que o pipeline fosse concluído. Mesmo que essa classe esteja apenas contida na maior, ela pode tornar o design mais compreensível para um purista da OO.