Quais são algumas estratégias de POO para trabalhar com um banco de dados, mas para manter as coisas testáveis? Digamos que eu tenha uma classe de Usuário e meu ambiente de produção funcione no MySQL. Vejo algumas abordagens possíveis, mostradas aqui usando PHP:
Passe um $ data_source com interfaces para
load()esave(), para abstrair a fonte de dados de back-end. Ao testar, passe em um armazenamento de dados diferente.$ usuário = novo usuário ($ mysql_data_source); $ user-> load ('bob'); $ user-> setNickname ('Robby'); $ usuário-> save ();Use uma fábrica que acesse o banco de dados e passe a linha de resultados ao construtor do Usuário. Ao testar, gere manualmente o parâmetro $ row ou zombe do objeto em UserFactory :: $ data_source. (Como posso salvar as alterações no registro?)
class UserFactory { static $data_source; public static function fetch( $username ) { $row = self::$data_source->get( [params] ); $user = new User( $row ); return $user; } }
Eu tenho Design Patterns e Clean Code aqui ao meu lado, mas estou lutando para encontrar os conceitos aplicáveis.