Pergunta

No caso de uma API fornecer Rect :: contém (Point) ou Ponto :: is_inside (Rect) ou ambos? ou Math :: contém (Point, Rect) porque é simétrica?

O mesmo Q vai para LineSegment :: contém (Point), Rect :: fully_contains (círculo) etc.

Foi útil?

Solução

Rect::contains(Point) faz mais sentido, pois é um bloco de construção. O outro não é realmente necessário como seria de esperar cada forma específica para implementar a operação, enquanto o Point não tem de saber sobre todas as formas possíveis. A mesma resposta vale para LineSegment.

No que diz respeito à relação entre Circle e Rect é mais complicado usando a maioria dos frameworks orientados a objetos e não tem qualquer resposta definitiva. Algum outro estilo de objeto orientado como CLOS fazer isso usando funções e métodos genéricos tornando-se um não questão.

Outras dicas

depende inteiramente o que faz a expressão de seu aspirador de programa, mais alinhado com o problema que você está tentando resolver. Então, de certa forma, todos os itens acima deve ser fino em diferentes contextos.

No entanto, de modo geral, estou ligeiramente inclinado em favor do Rect::contains(Point) em vez de Point::Is_inside(Rect). Isso é porque eu acho que a classe Point, uma vez que seria usado por todos os tipos de classes (como um 'círculo', 'Hexagon' etc.) deve ser muito básico e contêm apenas a interface mínimo.

Math::contains(Rect, Point) seria minha segunda opção. Gostaria de usar essa abordagem, se eu queria manter a minha classe Retângulo muito primitivo e não acrescentar muito funções "conveniência" a ele.

Uma coisa importante a lembrar é, não consideram o design de suas aulas como está escrito em pedra. Basta ir em frente e escolher o design que parece melhor agora . Sempre que suas necessidades mudam, você pode e você deve alterá-lo. Isto é o que é chamado refatoração .

Eu estou com Frederick no Math :: contém abordagem, embora a maior desvantagem na minha opinião é que o desenvolvedor perde a descoberta de IntelliSense em encontrar o método. Essa é uma das minhas beefs com Boost e STL.

Um exemplo de onde Rect :: contém, eventualmente der errado é o método de cordas desenho do iPhone SDK, que é basicamente Cadeia :: drawInRect.

Depende da implementação, mas como Federick Eu também tendem a ir para Math :: contém (Rect, Point) , sobre Rect :: contém (Point) . A razão para isto é que esta leva a uma hierarquia de objetos que inclui o contém função de membro como um virtual, que fica substituído de classe para classe. Isso pode ter uma sobrecarga potencialmente significativo onde você está lidando com um grande número de retângulos e primitivas semelhantes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top