Recientemente tuve una idea, usar chatGPT para hacer diagrama de clases y los resultados fueron sorprendentes.
Tiempo Necesario : 40 minutes
Como hacer un diagrama de clases usando ChatGPT
Haz una pregunta relativa al tema que deseas modelar
Recuerda que usar palabras como tipo, clasificación o tipología te facilitara modelar un problema en clases.
Prompt de ejemplo:
“20 types of [tu concepto aquí]”
Mi prompt fue en ingles para evitar confusiones, pero como criterio si una búsqueda en Google search no te regresara resultados ambiguos podrías usarla en tu idioma.Indica crear un diagrama de clases en codigo de plantuml
Prompt de ejemplo:
“create code for plantuml class diagram based on the previous response”simplifica tu modelo
En mi caso mi prompt fue:
“modify the previous class diagram to use inheritance”aplica trucos de ingeniería de software (opcional)
En mi caso no fue necesario pero puedes pedirle por ejemplo que aplique algún patrón de diseño o principio de diseño a tu diagrama de clases
“also refactor by applying [principio o patrón de diseño]”
Herramientas
- PlantUML
- ChatGPT
Caso de estudio
Para mi caso se trata de un sistema de cuestionarios del cual ya tenia algo de código así que empecé a pedirle una tipología de preguntas como si se tratara de una investigación preliminar.
20 types of quiz question types with 1 example each in 2000 words or less
Esto me arrojo lo siguiente:
Multiple choice: What is the capital of France? a) London b) Rome c) Paris d) Madrid True or false: The Great Wall of China is the longest wall in the world. Fill in the blank: The ____ of Independence was signed in 1776. Matching: Match the following terms with their definitions: i. Monarchy ii. Democracy iii. Dictatorship a) A form of government in which the ruler is an absolute dictator b) A form of government in which the people have the power to make decisions c) A form of government in which a king or queen holds supreme authority Short answer: Describe the process of photosynthesis. Essay: Explain the causes and effects of World War II. Word scramble: Rearrange the letters to spell a word related to weather: R-A-I-N Word search: Find the following words in the puzzle: SUN, CLOUD, SKY, RAIN Crossword: Solve the crossword puzzle using clues related to science terms. Hangman: Guess the word by selecting letters. (Note: This type of question is not recommended as it can be seen as inappropriate or offensive to some people.) Ordering: Put the following events in chronological order: i. The Civil War ii. The American Revolution iii. The Declaration of Independence Ranking: Rank the following animals from most to least intelligent: i. Chimpanzees ii. Dogs iii. Cats iv. Fish Grouping: Group the following items into categories: i. Apple ii. Orange iii. Banana iv. Carrot v. Potato Sequencing: Arrange the following steps in the correct order to perform a chemistry experiment: i. Gather materials ii. Set up the workspace iii. Conduct the experiment iv. Record observations v. Clean up Sorting: Sort the following items into two categories: animals that live on land and animals that live in water. i. Elephant ii. Shark iii. Bird iv. Fish v. Snake Labeling: Label the parts of a plant in the diagram below: Drag and drop: Drag the following words into the correct category: i. Dog ii. Cat iii. Fish iv. Mouse Pets | Wild animals Hot spot: Click on the location of the capital city on the map. Audio: Listen to the audio clip and choose the correct answer. Video: Watch the video and answer the following questions: What is the main theme of the video? What is the message being conveyed?
que es plant uml?
PlantUML es una herramienta de generación de diagramas mediante texto que permite a los usuarios crear mayormente diagramas UML, usando un estilo que recuerda código C para el caso de diagrama de clase.
Puedes usar la versión en línea para visualizar y editar diagramas de clase en formato PlantUML.
Una vez aclarado que es plantUML procedemos a solicitarle a chatGPT que generara el diagrama de clases
create code for plantuml class diagram based on the previous response
Esto produjo la siguiente salida truncada
@startuml
class Quiz {
- multipleChoice: MultipleChoice[]
- trueOrFalse: TrueOrFalse[]
- fillInTheBlank: FillInTheBlank[]
- matching: Matching[]
- shortAnswer: ShortAnswer[]
- essay: Essay[]
- wordScramble: WordScramble[]
- wordSearch: WordSearch[]
- crossword: Crossword[]
- hangman: Hangman[]
- ordering: Ordering[]
- ranking: Ranking[]
- grouping: Grouping[]
- sequencing: Sequencing[]
- sorting: Sorting[]
- labeling: Labeling[]
- dragAndDrop: DragAndDrop[]
- hotSpot: HotSpot[]
- audio: Audio[]
- video: Video[]
}
class MultipleChoice {
- question: string
- options: string[]
- answer: string
}
class TrueOrFalse {
- question: string
- answer: boolean
}
class FillInTheBlank {
- question: string
- answer: string
}
class Matching {
- terms: string[]
- definitions: string[]
- pairs: (string, string)[]
}
class ShortAnswer {
- question: string
- answer: string
}
class Essay {
- question: string
- answer: string
}
class WordScramble {
- question: string
- answer: string
}
class WordSearch {
- puzzle: string[][]
- words: string[]
}
class Crossword {
- puzzle: string[][]
- clues: (string, string)[]
}
class Hangman {
- word: string
- guess: string
}
class Ordering {
- items: string[]
}
class Ranking {
- items: string[]
}
class Grouping {
- items: string[]
}
class Sequencing {
- steps: string[]
}
class Sorting {
- items: string[]
}
class Labeling {
- diagram: string
- labels: string[]
}
class DragAndDrop {
- items: string[]
- categories: string[]
}
class HotSpot {
- image: string
- location: (int, int)
}
class Audio {
- clip: string
- options: string[]
- answer: string
}
class Video {
- video: string
- theme: string
- message: string
}
Quiz "1" -- "20" MultipleChoice
Quiz "1" -- "20" TrueOrFalse
Quiz "1" -- "20" FillInTheBlank
Quiz "1" -- "20" Matching
Quiz "1" -- "20" ShortAnswer
Quiz "1" -- "20" Essay
Quiz "1" -- "20" WordScramble
Quiz "1" -- "20" WordSearch
Quiz "1" -- "20" Crossword
Quiz
La primera salida de diagrama de clase que genero chatGPT contiene las clases de preguntas, asi que la inteligencia artificial nos hizo la detección y el modelado de entidades, además de la toma de requerimientos, lo cual es excelente.
El siguiente paso es solicitarle que aplique herencia para que plasme las relaciones entre las entidades.
modify the previous class diagram to use inheritance
esto producirá la siguiente modificación
@startuml
abstract class QuizQuestion {
- question: string
}
class MultipleChoice extends QuizQuestion {
- options: string[]
- answer: string
}
class TrueOrFalse extends QuizQuestion {
- answer: boolean
}
class FillInTheBlank extends QuizQuestion {
- answer: string
}
class Matching extends QuizQuestion {
- terms: string[]
- definitions: string[]
- pairs: (string, string)[]
}
class ShortAnswer extends QuizQuestion {
- answer: string
}
class Essay extends QuizQuestion {
- answer: string
}
class WordScramble extends QuizQuestion {
- answer: string
}
class WordSearch extends QuizQuestion {
- puzzle: string[][]
- words: string[]
}
class Crossword extends QuizQuestion {
- puzzle: string[][]
- clues: (string, string)[]
}
class Hangman extends QuizQuestion {
- word: string
- guess: string
}
class Ordering extends QuizQuestion {
- items: string[]
}
class Ranking extends QuizQuestion {
- items: string[]
}
class Grouping extends QuizQuestion {
- items: string[]
}
class Sequencing extends QuizQuestion {
- steps: string[]
}
class Sorting extends QuizQuestion {
- items: string[]
}
class Labeling extends QuizQuestion {
- diagram: string
- labels: string[]
}
class DragAndDrop extends QuizQuestion {
- items: string[]
- categories: string[]
}
class HotSpot extends QuizQuestion {
- image: string
- location: (int, int)
}
class Audio extends QuizQuestion {
- clip: string
- options: string[]
- answer: string
}
class Video extends QuizQuestion {
- video: string
- theme: string
- message: string
}
class Quiz {
- multipleChoice: MultipleChoice[]
- trueOrFalse: TrueOrFalse[]
- fillInTheBlank: FillInTheBlank[]
- matching: Matching[]
- shortAnswer: ShortAnswer[]
- essay: Essay[]
- wordScramble: WordScramble[]
- wordSearch: WordSearch[]
- crossword: Crossword[]
- hangman: Hangman[]
- ordering: Ordering[]
- ranking: Ranking[]
- grouping: Grouping[]
- sequencing: Sequencing[]
- sorting: Sorting[]
- labeling: Labeling[]
- dragAndDrop: DragAndDrop[]
- hotSpot: HotSpot[]
- audio: Audio[]
- video: Video[]
}
Quiz "1" -- "20" MultipleChoice
Quiz "1" -- "20" TrueOrFalse
Quiz "1" -- "20" FillInTheBlank
Quiz "1" -- "20" Matching
Quiz "1" -- "20
procedemos a agregarle algunas cosas que ya habíamos pensado en nuestro diseño del sistema basado no solo en el modelado de las entidades, sino además de la funcionalidad que debería de tener.
add to the previous code the following elements: answer explanation, category, difficulty, user answer attempt and a method to validate the user answer agains the expected answer/answers that provides a numeric score
@startuml
abstract class QuizQuestion {
- question: string
- answerExplanation: string
- category: string
- difficulty: int
- userAnswer: string
+ validateAnswer(): int
}
class MultipleChoice extends QuizQuestion {
- options: string[]
- answer: string
+ validateAnswer(): int
}
class TrueOrFalse extends QuizQuestion {
- answer: boolean
+ validateAnswer(): int
}
class FillInTheBlank extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class Matching extends QuizQuestion {
- terms: string[]
- definitions: string[]
- pairs: (string, string)[]
+ validateAnswer(): int
}
class ShortAnswer extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class Essay extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class WordScramble extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class WordSearch extends QuizQuestion {
- puzzle: string[][]
- words: string[]
+ validateAnswer(): int
}
class Crossword extends QuizQuestion {
- puzzle: string[][]
- clues: (string, string)[]
+ validateAnswer(): int
}
class Hangman extends QuizQuestion {
- word: string
- guess: string
+ validateAnswer(): int
}
class Ordering extends QuizQuestion {
- items: string[]
+ validateAnswer(): int
}
class Ranking extends QuizQuestion {
- items: string[]
+ validateAnswer(): int
}
class Grouping extends QuizQuestion {
- items: string[]
+ validateAnswer(): int
}
class Sequencing extends QuizQuestion {
- steps: string[]
+ validateAnswer(): int
}
class Sorting extends QuizQuestion {
- items: string[]
+ validateAnswer(): int
}
class Labeling extends QuizQuestion {
- diagram: string
- labels: string[]
+ validateAnswer(): int
}
class DragAndDrop extends QuizQuestion {
- items: string[]
- categories: string[]
+ validateAnswer(): int
}
class HotSpot extends QuizQuestion {
- image: string
- location: (int, int)
+ validateAnswer(): int
}
class Audio extends QuizQuestion {
- clip: string
- options: string[]
- answer: string
+ validateAnswer(): int
}
class Video extends QuizQuestion {
- video: string
- theme: string
- message: string
+ validateAnswer(): int
}
class Quiz {
- multipleChoice: MultipleChoice[]
- trueOrFalse: TrueOrFalse[]
- fillInTheBlank: FillInTheBl
Aun quedaron algunos campos duplicados, así que podemos optimizar mas el modelo con una segunda pasada de herencia
also simplify in the plantuml code those question types with the same fields using inheritance
eso simplifico un poco, pero no fue perfecto debido a que habia elementos que no estaban juntos así que aplicamos una tercera pasada
also simplify in the plantuml code those question types with the field items using inheritance
finalmente especificamos el ultimo caso que ha quedado olvidado
also make DragAndDrop to inherit ItemQuestion to get rid of items field in the plantuml code
lo cual nos da esta versión
@startuml
abstract class QuizQuestion {
- question: string
- answerExplanation: string
- category: string
- difficulty: int
- userAnswer: string
+ validateAnswer(): int
}
abstract class MultipleChoiceQuestion extends QuizQuestion {
- options: string[]
- answer: string
+ validateAnswer(): int
}
class MultipleChoice extends MultipleChoiceQuestion {
+ validateAnswer(): int
}
class TrueOrFalse extends MultipleChoiceQuestion {
+ validateAnswer(): int
}
abstract class ShortAnswerQuestion extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class ShortAnswer extends ShortAnswerQuestion {
+ validateAnswer(): int
}
class FillInTheBlank extends ShortAnswerQuestion {
+ validateAnswer(): int
}
class Matching extends QuizQuestion {
- terms: string[]
- definitions: string[]
- pairs: (string, string)[]
+ validateAnswer(): int
}
class Essay extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class WordScramble extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class WordSearch extends QuizQuestion {
- puzzle: string[][]
- words: string[]
+ validateAnswer(): int
}
class Crossword extends QuizQuestion {
- puzzle: string[][]
- clues: (string, string)[]
+ validateAnswer(): int
}
class Hangman extends QuizQuestion {
- word: string
- guess: string
+ validateAnswer(): int
}
abstract class ItemQuestion extends QuizQuestion {
- items: string[]
+ validateAnswer(): int
}
class Ordering extends ItemQuestion {
+ validateAnswer(): int
}
class Ranking extends ItemQuestion {
+ validateAnswer(): int
}
class Grouping extends ItemQuestion {
+ validateAnswer(): int
}
class Sequencing extends ItemQuestion {
+ validateAnswer(): int
}
class Sorting extends ItemQuestion {
+ validateAnswer(): int
}
class Labeling extends QuizQuestion {
- diagram: string
- labels: string[]
+ validateAnswer(): int
}
class DragAndDrop extends ItemQuestion {
- categories: string[]
+ validateAnswer(): int
}
class HotSpot extends QuizQuestion {
- image: string
- location: (int, int)
+ validateAnswer(): int
}
class Audio extends QuizQuestion {
- clip: string
- options: string[]
- answer: string
+ validateAnswer(): int
}
class Video extends QuizQuestion {
- video: string
- theme
a pesar de que la salida esta truncada podemos fácilmente saber que falta usando los diagramas anteriores que había generado.
Conclusión
Es increíble el nivel de comprensión que tiene chatGPT para hacer modificaciones al modelo y al código según lo que le indiquemos, ciertamente excedió mis expectativas.
El script corregido por mi:
@startuml
abstract class QuizQuestion {
- question: string
- answerExplanation: string
- category: string
- difficulty: int
- userAnswer: string
+ validateAnswer(): int
}
abstract class MultipleChoiceQuestion extends QuizQuestion {
- options: string[]
- answer: string
+ validateAnswer(): int
}
class MultipleChoice extends MultipleChoiceQuestion {
+ validateAnswer(): int
}
class TrueOrFalse extends MultipleChoiceQuestion {
+ validateAnswer(): int
}
abstract class ShortAnswerQuestion extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class ShortAnswer extends ShortAnswerQuestion {
+ validateAnswer(): int
}
class FillInTheBlank extends ShortAnswerQuestion {
+ validateAnswer(): int
}
class Matching extends QuizQuestion {
- terms: string[]
- definitions: string[]
- pairs: (string, string)[]
+ validateAnswer(): int
}
class Essay extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class WordScramble extends QuizQuestion {
- answer: string
+ validateAnswer(): int
}
class WordSearch extends QuizQuestion {
- puzzle: string[][]
- words: string[]
+ validateAnswer(): int
}
class Crossword extends QuizQuestion {
- puzzle: string[][]
- clues: (string, string)[]
+ validateAnswer(): int
}
class Hangman extends QuizQuestion {
- word: string
- guess: string
+ validateAnswer(): int
}
abstract class ItemQuestion extends QuizQuestion {
- items: string[]
+ validateAnswer(): int
}
class Ordering extends ItemQuestion {
+ validateAnswer(): int
}
class Ranking extends ItemQuestion {
+ validateAnswer(): int
}
class Grouping extends ItemQuestion {
+ validateAnswer(): int
}
class Sequencing extends ItemQuestion {
+ validateAnswer(): int
}
class Sorting extends ItemQuestion {
+ validateAnswer(): int
}
class Labeling extends QuizQuestion {
- diagram: string
- labels: string[]
+ validateAnswer(): int
}
class DragAndDrop extends ItemQuestion {
- categories: string[]
+ validateAnswer(): int
}
class HotSpot extends QuizQuestion {
- image: string
- location: (int, int)
+ validateAnswer(): int
}
class Audio extends QuizQuestion {
- clip: string
- options: string[]
- answer: string
+ validateAnswer(): int
}
class Video extends QuizQuestion {
- video: string
- theme: string
- message: string
+ validateAnswer(): int
}
class Quiz {
- questions: QuizQuestion[]
}
@enduml
Esto generaría el siguiente diagrama
Si lo deseas puedes ver las modificaciones que le hice a mi sistema opensource para seguir las recomendaciones del modelo UML que genero plantUML en mi repositorio de github.
NOTA: recién aprendí que si algo de la respuesta se corta se le puede escribir “continua” y chatGPT trata de seguir con lo que falta de la respuesta siendo esto muy util en la mayoria de los casos, excepto cuando regresa código demasiado extenso