Как визуализировать полиморфные вызовы в одной диаграмме?


Во-первых, смотрите эти коды Java:

Вытягиваемый.java

package examples.simple.model;

public interface Drawable {
    public void draw();
}

Форма.java

package examples.simple.model;

public abstract class Shape  implements Drawable {
    private Point center;

    public Point getCenter() {
        return center;
    }

    public void setCenter(Point center) {
        this.center = center;
    }
}

Прямоугольник.java

package examples.simple.model;

public class Rectangle extends Shape {
    public void draw() {
        System.out.println("Drawing a rectangle....");
    }
}

Круг.java

package examples.simple.model;

public class Circle extends Shape {
    public void draw() {
        System.out.println("Drawing a circle....");
    }
}

Линия.java

package examples.simple.model;

public class Line implements Drawable{
    public void draw() {
        System.out.println("Drawing a line");
    }
}

Заговорщик.java

package examples.simple.client;

import java.util.ArrayList;
import java.util.List;

import examples.simple.model.Circle;
import examples.simple.model.Drawable;
import examples.simple.model.Rectangle;
import examples.simple.model.Shape;
import examples.simple.model.Line;

class Plotter {

    public static void main(String[] args) {
        List<Drawable> drawables = new ArrayList<Drawable>();

        Shape s = new Circle();
        drawables.add(s);

        s = new Rectangle();
        drawables.add(s);

        Line l = new Line();
        drawables.add(l);

        for (Drawable drawable : drawables) {
            drawable.draw();
        }
    }
}
Коды являются классическим примером полиморфизма. Диаграмма классов для этого кода имеет вид

Введите описание изображения здесь

Когда я попытался смоделировать эти классы, используя диаграмму последовательности UML, чтобы показать полиморфизм, используя только одну диаграмму последовательности, мне пришлось использовать ЧЕТЫРЕ комментария для представления полиморфизма.

Введите описание изображения здесь

Итак, как визуализироватьполиморфные вызовы в одной диаграмме , без комментариев? Есть ли другая нотация или визуализация (нет последовательности UML или схемы связи), чтобы показать полиморфизм? В этом примере, как показать вызов drawable.draw() в Plotter.main()?
3 2

3 ответа:

Диаграммы последовательностей сильны в отображении взаимодействий, они не очень хорошо подходят для описания структурных свойств модели.

Диаграмма классовможет быть тем, что вам нужно. Ниже приведен пример диаграммы классов, которая показывает полиморфизм (а именно метод getArea).

Введите описание изображения здесь

Используя идею, предложенную вЗаводском методе построения диаграмм паттернов – последовательностей , полиморфные вызовы моделируются несколькими сценариями, управляемыми условиями защиты. Таким образом, для каждого полиморфного сценария динамическое связывание (полиморфный вызов) представлено для "окна сценария". Итак, это единственная модель (диаграмма последовательности) для отображения полиморфных вызовов.

Схема последовательностей для представления полиморфных сценариев

Буквально, пост автора комментирует вашу стратегию моделирования:

" оказывается, что для моделирования потока операций я на самом деле моделирование того, как работает полиморфизм, позднее связывание и все такое прочее. Я предположим, что в этом случае схема последовательности не только не имеет значения, но на самом деле сбивает с толку. Но я должен был попытаться."

В заключение, показать полиморфные вызовы-нетривиальная задача, и я думаю, что ясно визуализировать полиморфизм на самом деле является открытым вызовом для инженеров-программистов.

По причинам, которые я привел в своем комментарии (каждый объект имеет свою собственную линию жизни, каждое сообщение является одним вызовом и т. д.), трудно (если не невозможно и неправильно) попытаться сделать это в одной диаграмме.

Кроме того, красота полиморфизма заключается в том, что на определенном уровне (полиморфный вызов) мы не хотим знать детали. Вызов производится к draw() , и он Просто работает , независимо от реализующего класса. Детали скрыты в абстракции. язык UML диаграммы полезны, когда они показывают существенную информацию.

Введите описание изображения здесь

В вашем ответе каждая из фигур просто получает сообщение draw() (мы не видим никакой разницы в поведении от диаграммы последовательности). Если вам действительно нужно уточнить различия между реализациями Circle и т. д., Я предлагаю представлять полиморфные вызовы в отдельных диаграммах, чтобы мы могли видеть, какие различные объекты используются для достижения функции draw(), например :

Введите описание изображения здесь