Representando vehículos y sus componentes -- ++ campo con qt camp codereview Relacionados El problema

Representing vehicles and their components


3
vote

problema

Español

Estoy trabajando en un proyecto que necesita representar diferentes tipos de vehículos, componentes de estos vehículos y partes reales de los componentes.

Hasta ahora tengo este código:

  maxPassLength8  

También tengo maxPassLength9 y import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 0 Clases que se filtran públicamente del vehículo, cada una de ellas que tienen sus propios componentes. Luego, cada componente se deriva de import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 1 y tiene varias partes (derivando de import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 2 , es decir, 99887776655443323 tiene 99887776655443324 s , import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 5 , etc.). Ambos import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 6 import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 7 HERENE DE import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 8 .

En primer lugar, ¿este diseño malo es este mal diseño? ¿Cómo puede mejorarse?

En segundo lugar, tengo una pregunta sobre la creación de los objetos específicos del vehículo. ¿Debería import com4j.Variant; import java.util.HashMap; import javax.swing.JOptionPane; import word.Documents; import word.WdOpenFormat; import word._Application; import word._Document; public class DocPasswordFinder { public final static String filePath2 = "\file\abc.doc"; private static HashMap<Integer, Character> mapC; private static final int passMaxLength; public static _Application app; public static Documents doc; public static char[] arr; static { passMaxLength=9; arr = new char[passMaxLength]; app = word.ClassFactory.createApplication(); doc = app.documents(); mapC=new HashMap<>(); for (int i = 0; i < 26; ++i) { mapC.put(i, (char) ('a' + i)); } } public static void genPass(int start, int indx) { if (indx == passMaxLength) { String PASSWORD = String.valueOf(arr); try { doc.open2000(filePath, false, true, false, PASSWORD, "", false, PASSWORD, "", WdOpenFormat.wdOpenFormatAuto, false, false); JOptionPane.showMessageDialog(null, "FOUND: " + PASSWORD); System.exit(0); } catch (com4j.ComException ex) { //continue; } } else { if (indx < arr.length) { for (int i = start; i < 26; ++i) { arr[indx] = mapC.get(i); genPass(start, indx + 1); } } } } public static void main(String[] args) { genPass(0, 0); } } 9655443329 's Constructor requiere los mismos parámetros que doc.open2000()0 PLUY OTROS? ¿Qué hay de sus componentes? ¿Debo pasar a los punteros de constructor para crear ya doc.open2000()11 s creado en doc.open2000()33 's constructor?

Original en ingles

I am working on a project that needs to represent different kinds of vehicles, components of these vehicles and actual parts of the components.

So far I have this code:

class Vehicle { public:     /* Public interface */      //ctor     Vehicle(int id, int year, int mileage, int weight, int length, int width, int height, int wheelbase,         const QString& date, const QString& type, const QString& maker, const QString& model, const QString& color, const QString& plate);      //copy/move     Vehicle(const Vehicle&) = delete;     Vehicle(Vehicle&&) = delete;     Vehicle& operator=(const Vehicle&) = delete;     Vehicle& operator=(Vehicle&&) = delete;      //dtor     virtual ~Vehicle();      //getters     inline int getId() const { return m_id; }     inline int getYear() const { return m_year; }     inline int getMileage() const { return m_mileage; }     inline int getWeight() const { return m_weight; }     inline int getLength() const { return m_length; }     inline int getWidth() const { return m_width; }     inline int getHeight() const { return m_height; }     inline int getWheelbase() const { return m_wheelbase; }      inline const QString& getDateReceived() const { return m_date_received; }     inline const QString& getType() const { return m_type; }     inline const QString& getMaker() const { return m_maker; }     inline const QString& getModel() const { return m_model; }     inline const QString& getColor() const { return m_color; }     inline const QString& getPlate() const { return m_plate; }      inline const QList<QImage*>& getImages() const { return m_images; }     inline const QImage& getThumbnail() const { return m_thumbnail; }  protected:     /* Protected methods */      //adds another component to this vehicle     inline void addComponent(Component* c)     {         m_components << c;     }  private:     /* Private data members */      QList<Component*> m_components;      int m_id;     int m_year;     int m_mileage;     int m_weight;     int m_length;     int m_width;     int m_height;     int m_wheelbase;      QString m_date_received;     QString m_type;     QString m_maker;     QString m_model;     QString m_color;     QString m_plate;      QList<QImage*> m_images;     QImage m_thumbnail; };  class Car : public Vehicle { public:     /* Public interface */      //ctor     Car();      //copy/move     Car(const Car&) = delete;     Car(Car&&) = delete;     Car& operator=(const Car&) = delete;     Car& operator=(Car&&) = delete;      //dtor     virtual ~Car();  private:     /* Private data members */      Body* m_body;     Brake* m_brake;     Direction* m_direction;     Engine* m_engine; }; 

I also have Moto and Bike classes publicly inheriting from Vehicle, each of them having their own components. Then, each component derives from Component and has several parts (deriving from Part, i.e. a Body has Wings, Capote, etc). Both Component and Part inherit from AbstractComponent.

First off, is this bad design? How can it be improved?

Secondly, I have a question about creating the specific vehicle objects. Should Car's constructor require the same parameters as Vehicle plus others? How about its components? Should I pass to the constructor pointers to already created Components, or should the Components be created in Car's constructor?

     
         
         

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

La arquitectura me parece estar bien como es. Es bueno que haya usado un poco de componentes de componentes en lugar de realizar una cadena de herencia absurda en Car . Tal vez otra persona tendrá más comentarios sobre el diseño, pero si no tiene problemas con él, mi opinión es dejarlo como se mantiene.

Algunos otros detalles que me gustaría comentar:

  • No parece haber ningún método que cambie un 9988776665544331 después de que se construya una instancia. Este es un buen diseño. Debe favorecer la inmutabilidad siempre que sea práctico. Dado que este es el caso, debe hacer cumplir aún más que los vehículos no están mutados haciendo que sus variables de miembro const . Entonces solo permite configurarlos una vez en el constructor. E.G.:

      const int m_id; const int m_year; const int m_mileage; const int m_weight; const int m_length; const int m_width; const int m_height; const int m_wheelbase; ...   

    Probablemente no podrás hacer que el 9988776665544334 s const. Pero eso no es un gran problema. Marca con const lo que puede.

  • Vehicle 's Constructor tiene muchos parámetros. Puede ser confuso llamarlo, ya que muchos parámetros tienen el mismo tipo. Una forma de consolidar la gran cantidad de parámetros tendrían una especie de VehicleDesc estructura de ayuda a la agrupación de todos los parámetros. Pero eso podría o no ser una solución mejor, depende. Tampoco simplifica la configuración de un 9988776665544338 . Otra posibilidad podría estar construyendo desde un flujo o archivo (también conocido como Serialize / De-Serialize).

  • Cuando ya elimina el constructor de copia y el operador de asignación, no tiene que eliminar también los movimientos. Recuerde que el operador y el constructor de movimiento no se agregan de forma predeterminada a todas las clases por el compilador, a diferencia de la copia / asignación. citando esta muy buena respuesta StackOverFlow :

    Incluso si desea que su clase no sea correcta ni móvil, es Mejor simplemente eliminar los miembros de la copia y dejar los miembros de movimiento no declarado (lo que significa que no existirán). Si alguna vez estás revisando el código (Incluyendo el suyo), y vea a los miembros del movimiento eliminado, casi están Ciertamente incorrecto, o en el mejor superfluo y confuso.

  • No necesita agregar la palabra clave inline65544339 al declarar un método miembro directamente dentro del cuerpo de la clase en el archivo de encabezado. Dichos métodos ya están implícitamente (al compilador) y claramente (al lector) en línea.

  • Secundación para un comentario en su publicación, no escriba comentarios evidentes como Vehicle0 o Vehicle1 . Esa es solo la contaminación visual, más, si se arrastra las secciones de clase y se olvida de mover los comentarios con ella, creará discrepancias.

  • Acerca de su pregunta de Vehicle2 's Replicación de los parámetros de Vehicle3 , si tiene acceso a C ++ 11, probablemente querrá Para usar constructor herencia . De lo contrario, me temo que tendrá que replicar la lista de parámetros del constructor y simplemente reenviar los datos a Vehicle4 .

  • Finalmente, la propiedad de los punteros en su código me preocupa un poco. Vehicle5 tiene punteros crudos a sus componentes, que asumo que también se replica en la lista de componentes de Vehicle6 . Hay un cierto potencial para los errores de memoria allí. Probablemente esté muy familiarizado con el código y se sabe exactamente cuando las cosas se asignan y eliminan, pero no espere al siguiente tipo que pase este proyecto para estar familiarizado con él (o incluso usted mismo podría olvidarlo en unos pocos meses. !). Las personas que mantienen su código son mucho más propensas a presentar errores que usted. Por este motivo, principalmente, abogaría por el uso de punteros inteligentes . Vehicle7 debe mantener Vehicle8 S a sus componentes, por lo que 99887766555443319 puede almacenar const0 s en su lista de componentes.

 

The architecture seems fine to me the way it is. It's nice that you have used a little bit of componentization instead of doing some absurd inheritance chain in Car. Maybe someone else will have more comments on the design, but if you are not having problems with it, my opinion is to leave it as it stands.

A few other details I would like to comment on:

  • There doesn't seem to be any method that changes a Vehicle after an instance is constructed. This is a good design. You should favor immutability whenever practical. Since this is the case, you should further enforce that the vehicles are not mutated by making its member variables const. Then you only allow setting them once in the constructor. E.g.:

    const int m_id; const int m_year; const int m_mileage; const int m_weight; const int m_length; const int m_width; const int m_height; const int m_wheelbase; ... 

    You probably won't be able to make the QLists const though. But that's not a big deal. Mark with const what you can.

  • Vehicle's constructor has a lot of parameters. It might be confusing to call it, since many parameters have the same type. One way to consolidate the large number of parameters would be having a sort of VehicleDesc helper structure grouping all the parameters. But that might or might not be a better solution, it depends. It also doesn't simplify setting up a Vehicle. Another possibility might be constructing from a stream or file (AKA serialize/de-serialize).

  • When you already delete the copy constructor and assignment operator you don't have to also delete the move ones. Remember that move operator and constructor are not added by default to all classes by the compiler, unlike the copy/assign ones. Quoting this very good StackOverflow answer:

    Even if you want your class to not be copyable nor movable, it is better to just delete the copy members and leave the move members undeclared (meaning they won't exist). If you're ever reviewing code (including your own), and see deleted move members, they are almost certainly incorrect, or at the very best superfluous and confusing.

  • You don't need to add the inline keyword when declaring a member method directly inside the class body in the header file. Such methods are already implicitly (to the compiler) and clearly (to the reader) inline.

  • Seconding for a comment in your post, don't write self evident comments like //ctor or //copy/move. That's just visual pollution, plus, if you shuffle class sections around and forget to move the comments with it, it will create discrepancies.

  • About your question of Car's constructor replicating the parameters of Vehicle, if you have access to C++11, the you'll probably want to use constructor inheritance. Otherwise, I'm afraid you will have to replicate the constructor's parameter list and just forward the data to Vehicle.

  • Finally, the ownership of pointers in your code worries me a little. Car has raw pointers to its components, which I assume are also replicated in the components list of Vehicle. There is a certain potencial for memory bugs there. You are probably very familiar with the code and knows exactly when things get allocated and deleted, but don't expect the next guy you pass this project on to be that familiar with it (or even yourself might forget about it in a few months time!). People maintaining your code are much more likely to introduce bugs than you are. For this reason, mainly, I would advocate for the use of smart pointers. Car should probably hold shared_ptrs to its components, so that Vehicle can store weak_ptrs in its component list.

 
 

Relacionados problema

1  Leyendo un archivo trozo por trozo en QT 4.3.3  ( Reading a file chunk by chunk in qt 4 3 3 ) 
Tengo el siguiente código en QT en ValidateKeys6 Calculé el buffersize según los comentarios. Estará útil si alguien puede revisar el código y avisarme ...

11  Hilo de pausa / reanudación / cancelación con qt  ( Thread pausing resuming canceling with qt ) 
He escrito este código para poder suspender (o cancelar) un trabajador ejecutado en un hilo separado en Qt. Para hacerlo, he usado una instancia QWaitCondi...

6  Leyendo un archivo de configuración ssh para una IP  ( Reading an ssh config file for an ip ) 
Escribí esta clase que lee un archivo de configuración SSH y comprueba si existe una IP. Si la IP no existe, la clase agrega un bloque para esa dirección IP. ...

6  Otro analizador de JSON y serializador para QT, pero con características adicionales  ( Yet another json parser and serializer for qt but with additional features ) 
Escribí QJson , una clase de utilidad en / para qt, necesito que eche un vistazo. Tanto es un analizador y serializador JSON, sino con una funcionalidad exte...

23  Ultimate Tic-Tac-Toe con AI y GUI  ( Ultimate tic tac toe with ai and gui ) 
Durante mi hiato, decidí revisar algunas de las preguntas de TIC-TAC-TOE aquí. Creé un simple juego de GUI de Tic-Tac-Toe, y luego pensé, también podría hacer...

5  Herramienta para preparar capturas de pantalla personalizadas para subir a Steam Cloud  ( Tool to prepare custom screenshots for uploading to steam cloud ) 
Recientemente he lanzado mi primera solicitud de QT, y me alegraría si alguien lo investigara y me diré si hay algunos patrones y gustos flagrantes. Esto ag...

1  Optimización de una conversión QT QByTearray  ( Optimization of a qt qbytearray conversion ) 
Escribí una función para convertir una representación de cadena hexadecimal (como 0x00) de algunos datos binarios a los datos en sí. ¿Cómo puedo mejorar est...

4  Enum Class para unidades de peso  ( Enum class for weight units ) 
Tengo algunas clases de enumeración para unidades, como unidades de peso (kg y lb). Estoy traduciendo el código a Qt C ++ de Java, y me pregunto cuál es la me...

5  Clase de plantilla de dereferencia  ( Dereference template class ) 
Por lo general, los algoritmos de la biblioteca estándar de C ++ tienen dos versiones, por ejemplo: template< class RandomIt > void sort( RandomIt first, R...

6  Diseño de MVC para cliente FTP  ( Mvc design for ftp client ) 
Esta aplicación será una aplicación de escritorio FTP para transferir archivos entre un servidor y un cliente, casi como FileZilla, no hay un código de servid...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos