ChatGPT para hacer diagrama de clases

,

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

  1. 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.

  2. Indica crear un diagrama de clases en codigo de plantuml

    Prompt de ejemplo:

    “create code for plantuml class diagram based on the previous response”

  3. simplifica tu modelo

    En mi caso mi prompt fue:

    “modify the previous class diagram to use inheritance”

  4. 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

modelo corregido

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


  • Cursos de Código Facilito

    Te comparto aquí mis recomendaciones de cursos de Código Facilito. Codigofacilito.com es una plataforma virtual de cursos en idioma exclusivamente español que inició como un canal de YouTube. Opinión de la plataforma En mi opinión la plataforma aún es incipiente y los cursos necesitan más trabajo, ya que es muy común hallarse con clases de…


  • Cursos de LinkedIn Learning

    Te comparto aquí mis recomendaciones de cursos de Linkedin Learning. LinkedIn Learning es una plataforma virtual de cursos propiedad de Microsoft. Hallarás mucho material en inglés, pues prácticamente todos los cursos vienen con subtítulos en castellano y en la parte técnica son muy buenos debido a la adquisición de Lynda.com. En mi opinión la plataforma…


  • Mockito: Snippets de código

    Estos snippets de código para entrevista acerca de mockito espero te sean de mucha utilidad. Claro que también los puedes usar para tu desarrollo en el día a día. Mock básico Si te llegan a mostrar algo como esto es mejor que sospeches, mockito se usa principalmente para pruebas de integración. Si llegas a ver…


javapro.org