Escribir sus sustantivos, verbos, adjetivos es un gran enfoque, pero prefiero pensar en el diseño de clase como pregunta ¿qué datos deben ocultarse?
Imagine que tiene un objeto y un objeto Query
Database
:
El objeto Query
le ayudará a crear y almacenar una consulta - tienda, es la clave aquí, como una función podría ayudarle a crear uno con la misma facilidad . Tal vez podrías quedarte: Query().select('Country').from_table('User').where('Country == "Brazil"')
. No importa exactamente la sintaxis: ¡ese es su trabajo! - la clave es que el objeto te ayuda ocultar algo, en este caso los datos necesarios para almacenar y generar una consulta. El poder del objeto proviene de la sintaxis de su uso (en este caso, un encadenamiento inteligente) y no necesita saber qué almacena para que funcione. Si se hace bien, el objeto Query
podría generar consultas para más de una base de datos. Internamente almacenaría un formato específico, pero podría convertirlo fácilmente a otros formatos al generar resultados (Postgres, MySQL, MongoDB).
Ahora, pensemos en el objeto Database
. ¿Qué esconde y almacena esto?¡Claramente no puede almacenar el contenido completo de la base de datos, ya que es por eso que tenemos una base de datos! Entonces, ¿cuál es el punto? El objetivo es ocultar cómo funciona la base de datos de personas que usan el objeto Database
. Las buenas clases simplificarán el razonamiento al manipular el estado interno. Para este objeto Database
, podría ocultar cómo funcionan las llamadas de red, o realizar consultas o actualizaciones por lotes, o proporcionar una capa de almacenamiento en caché.
El problema es que este objeto Database
es ENORME. Representa cómo acceder a una base de datos, por lo que bajo las coberturas podría hacer cualquier cosa y todo. Evidentemente, la conexión en red, el almacenamiento en caché y el procesamiento por lotes son bastante difíciles de manejar dependiendo de su sistema, por lo que ocultarlos sería muy útil. Pero, como muchas personas notarán, una base de datos es increíblemente compleja, y cuanto más lejos de las llamadas de base de datos que obtienes, más difícil es ajustar el rendimiento y comprender cómo funcionan las cosas.
Esta es la compensación fundamental de OOP. Si elige la abstracción correcta, simplifica la codificación (Cadena, Matriz, Diccionario), si selecciona una abstracción que es demasiado grande (Base de datos, Administrador de correo electrónico, Administrador de redes), puede ser demasiado compleja para comprender realmente cómo funciona, o qué esperar. El objetivo es ocultar la complejidad, pero es necesaria cierta complejidad. Una buena regla general es comenzar evitando los objetos Manager
, y en su lugar crear clases que son como structs
; todo lo que hacen es retener datos, con algunos métodos auxiliares para crear/manipular los datos para hacerte la vida más fácil. Por ejemplo, en el caso de EmailManager
comience con una función llamada sendEmail
que toma un objeto Email
. Este es un punto de partida simple y el código es muy fácil de entender.
En cuanto a su ejemplo, piense qué datos deben estar juntos para calcular lo que está buscando. Si quisiera saber qué tan lejos estaba caminando un animal, por ejemplo, podría tener las clases AnimalStep
y AnimalTrip
(colección de AnimalSteps). Ahora que cada viaje tiene todos los datos del paso, entonces debería ser capaz de resolver las cosas al respecto, quizás AnimalTrip.calculateDistance()
tiene sentido.
También es posible que desee considerar el uso de una base de datos (como sqlite: http://docs.python.org/library/sqlite3.html). Puede escribir un programa que lea sus enormes archivos de datos y los convierta en filas en las tablas de la base de datos. Luego, como segunda etapa, puede escribir programas que extraigan datos de la base de datos para realizar análisis adicionales. – unutbu
[¿Quiere decir algo como lo que pregunté aquí] (http://stackoverflow.com/questions/3738269/how-to-insert-arrays-into-a-database) @ubutbu? Estoy planeando hacerlo, pero primero me gustaría poder procesar todos los datos de una manera más organizada. –