Hola, coincido con lo que dice Enrique, a veces tampoco hay que enceguecerse con resolver todo OOP, si tu sistema realmente lo amerita perfecto, te puedo apuntar algo respecto a 
switch y 
ifs, si tu sistema abusa de ellos es porque realmente no es 100% o quizá ni siquiera lo sea 50%, si esto ocurre tu sistema presenta un acoplamiento importante y deberías estar usando en ese caso el polimorfismo. 
En tu problema, donde podes tener diferentes combinaciones de busqueda y no sabes de antemano cuantas combinaciones vas a tener, un diseño elegante sería usar el patrón Decorator, deberias tener una clase abstracta BusquedaDecorator y sus clases que heredan BusquedaAutor, BusquedaEdicion, BusquedaTitulo, etc. y asi una clase por cada atributo sobre el que quieras realizar la búsqueda, esto permite combinar o "decorar" tu búsqueda por todas las combinaciones que necesites, de esta manera agregar o quitar un criterio de busqueda sería transparente para tu diseño. 
Saludos.  
http://es.wikipedia.org/wiki/Decorat...de_dise%C3%B1o) 
Sergio Gabriel Rodriguez 
Perdón, cuando escribí "no es 100% o quizá ni siquiera lo sea 50%" me refería a 100% OOP. 
Saludos!. 
Sergio Gabriel Rodriguez