LINUX.ORG.RU
ФорумTalks

объектно-ориентированная сумма элементов в матрице


0

1

Скажите, правильно ли понимаю, что если пишем программу, где в функции main (допустим, это Java), вводится матрица, а потом просто считается сумма элементов и выводится - это процедурный стиль, но если мы вводим класс, представляющий матрицу или наследуем его и определяем ему метод - сумму элементов, а в функции main вызываем конструктор, а потом выводим результаты вызовы метода поиска суммы - это объектно-ориентированный подход?

Или как тогда надо понимать задание «найти сумму элементов в матрице с применением ООП»?

Определи класс матрицы, определи итератор, определи класс, отвечающий за свертку, определи генерик-интерфейс действия над двумя объектами, реализуй этот интерфейс для случая суммирования. Вызов в мэйн свертку по сумме для итератора матрицы. Вот тебе и ООП.

RedPossum ★★★★★
()
Ответ на: комментарий от yoghurt

Надо еще вместо матрицы сделать генерик-коллекцию для хранения всякого в матрице. А потом уже запилить класс матрицы в котором будет метод суммы, который вернет свертку по сумме для итератора матрицы-коллекции.

Ну да, классы для работы с числами нужны, без них никак.

RedPossum ★★★★★
()
Ответ на: комментарий от OldWiseCat

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

RedPossum ★★★★★
()

Интерфейс класса должен содержать только необходимые но достаточные методы. Для матрицы свойствами необходимости и достаточности обладают методы чтения элементов и конструирования новых матриц. Остальное можно при помощи независимых функций реализовать.

Absurd ★★★
()
interface Visitor {
    void visit(Item)
}

interface Visitable {
    void visit(Visitor);
}

class Item implements Visitable {
    public float v; // Знаю что плохо, но лень
    public void visit(Visitor v) { v.visit(this); }
}

class MatrixRow extends Vector<Item> implements Visitable  {
    public void visit(Visitor v) {
        Enumeration<Item> items = this.enumeration();
        while (items.hasMoreElements()) items.nextElement().visit(v);
    }
}

class Matrix extends Vector<MatrixRows> implements Visitable {
    public void visit(Visitor v) {
        Enumeration<MatrixRow> items = this.enumeration();
        while (items.hasMoreElements()) items.nextElement().visit(v);
    }
}

class SummaryVisitor implements Visitor {
    float s = 0;
    public void visit(Item i) { if (i!=null) s += i.v; }
    public void reset() { s = 0; }
    public float getsum() { return s; }
}
....
    Matrix m = ...;
    SummaryVisitor summarer = new SummaryVisitor();
    m.visit(summarer);
    System.out.println("Sum="+summarer);
...
no-dashi ★★★★★
()

Господа, вы забыли про статическую singleton фабрику, в которая, собственно, и будет возвращать реализацию интерфейса.
Само собой, все это должно быть сделано с использованием placeholder'ов на основе внутренних классов (чтобы была годна ленивая инициализация):

public enum InterfaceImplFactory {
    INSTANCE;
 
    private static class MatrixInterfaceImplHolder { 
            public static final MatrixInterfaceImpl INSTANCE = new MatrixInterfaceImpl();    
    }
 
    public static MatrixInterfaceImpl getMatrixInterfaceImpl() {
           return MatrixInterfaceImplHolder.INSTANCE;
    }

Остальные реализации интерфейсов тоже сюда потом добавить надо будет.

kovrik ★★★★★
()

Или как тогда надо понимать задание «найти сумму элементов в матрице с применением ООП»?

Как "наши мозги съедены ООП, убейте нас кто-нибудь".

dmfd
()
Ответ на: комментарий от OldWiseCat

Учитывая как устроены числа в java, в этой шутки есть доля истины.

soomrack ★★★★
()
Ответ на: комментарий от RedPossum

вот это надо бы матрицу запихнуть, чтобы просто matrix.getSum()

Угу, а потом добавлять getMult(), getAvg(), getLog() и т.п.? :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

а потом добавлять getMult(), getAvg(), getLog()

ну да, только еще интерфейсы надо выделить под каждый метод.

class Matrix imprements Summarizable, Multiplicatible, Averageble и т.д.

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

метод суммы у интерфейса Summable, который матрица будет реализовывать.

qnikst ★★★★★
()

Я в какой-то умной книжке читал, что работа с матрицами (и в частности перемножение) — это одна из тех задач, которые очень плохо ложатся на ООП.

CARS ★★★★
()

Не могу понять, для чего тебе математическую задачу решать в стиле ООП?

Deleted
()
Ответ на: комментарий от CARS

Прекрасно всё ложится

(defclass matrix ()
  ((data :reader data)))

(defmethod initialize-instance :after ((self matrix) &key
                                       (rows 1) (cols 1) (initial-element 0)
                                       (from #2A((0)) from-supplied-p))
  (setf (slot-value self 'data)
        (if from-supplied-p from
            (make-array `(,rows ,cols) :initial-element initial-element))))

(defmacro matrix-rows (matrix)
  `(first (array-dimensions (data ,matrix))))

(defmacro matrix-cols (matrix)
  `(second (array-dimensions (data ,matrix))))

(defmacro matrix-dimensions (matrix)
  `(array-dimensions (data ,matrix)))

(defmacro matrix-do ((row-index rows col-index cols) &body body)
  `(dotimes (,row-index ,rows)
     (dotimes (,col-index ,cols)
       ,@body)))

(defmacro matrix-reference (matrix row col)
  `(aref (data ,matrix) ,row ,col))

(defun matrix-ref (self row col)
  (matrix-reference self row col))

(defmacro matrix-tabulate ((matrix row-arg col-arg) &body body)
  `(progn
     (matrix-do (,row-arg (matrix-rows ,matrix) ,col-arg (matrix-cols ,matrix))
       (setf (matrix-ref ,matrix ,row-arg ,col-arg) ,@body))
     ,matrix))

(defun matrix-*-into (target left right)
  (if (and (equal (matrix-cols target) (matrix-cols right))
           (equal (matrix-rows target) (matrix-rows left)))
      (matrix-tabulate (target t-i t-j)
        (do ((i 0 (1+ i))
             (s 0 (+ s (* (matrix-ref left t-i i)
                          (matrix-ref right i t-j))))) 
            ((= i (matrix-cols left)) s)))        
      (error "Operation can not be performed")))
yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.