Изменить способ отображения объекта в таблице значений переменных отладчика / инспектора - PullRequest
3 голосов
/ 19 января 2020

Я хотел бы знать, есть ли сообщение, которое я могу переопределить в Pharo, чтобы мои пользовательские классы отображали более информативную информацию в инспекторе / отладчике так же, как это делают простые типы переменных, например, Integer или Strings. Например:

enter image description here

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

enter image description here

Я просмотрел форумы pharo и ничего не нашел, я также попытался переопределить более 30 методов, надеясь, что один из них изменил вывод. Только сообщение class, казалось, изменило вывод, но я мог только возвратить экземпляр Metaclass, и кроме того, что возиться с этим сообщением сломало бы много вещей. Наконец, я попытался провести обратный инжиниринг отладчика, а затем инспектора, чтобы увидеть, в какой точке построена таблица и какие значения используются или какие сообщения отправляются для создания указанных значений, но это было слишком для меня, колл-стэк продолжал расти и Я даже не мог поцарапать поверхность.

Ответы [ 3 ]

5 голосов
/ 19 января 2020

К счастью, сделать это на любом Smalltalk очень легко. Ожидается, что типы, унаследованные от Object, ответят на сообщение printString и, в конечном итоге, printOn: aStream. Ожидается, что в этих сообщениях будет дано описание объекта. Итак, вы должны просто переопределить printOn: в своем классе (printString использует printOn:), и все браузеры и инспекторы будут автоматически использовать его. В Pharo есть другие возможности, если вы хотите предоставить более сложную информацию на разных вкладках, но Я думаю printOn: будет достаточно для вас.

Примером будет:

MyPoint>>printOn: aStream
    aStream nextPut: ${.
    x printOn: aStream.
    aStream nextPutAll: ', '
    y printOn: aStream.
    aStream nextPut: $}
4 голосов
/ 19 января 2020

В Smalltalk каждый раз, когда вы наблюдаете что-то, что вам не нравится или не понимает, вы задаете вопрос: Какое сообщение делает это?

В вашем случае вопрос будет : Какое сообщение создает строку a MyPoint, которую я вижу повсюду?

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

  1. Напишите и выберите (MyPoint on: 14 and: -5) halt на игровой площадке .
  2. Щелкните правой кнопкой мыши и введите команду Print it (I Я предполагаю, что вы уже проверили, что эта команда производит строку 'a MyPoint').
  3. Отладка
  4. Go по сравнению с оценкой #DoIt, которая отвечает на результат
  5. Продолжайте таким образом, чередуя между Into и Over , чтобы убедиться, что вы следите за результатом до того места, где он принимается
  6. В конце концов вы достигнете реализации Object >> #printString. Корзина go!

Теперь вы можете открыть Системный браузер и взглянуть на этот метод, изучить, как он реализован в разных классах и т. Д. c. Ваше расследование должно показать, что самое основное c сообщение для печати - #printOn:. Вы также можете взглянуть на других разработчиков, чтобы лучше понять, что обычно делают люди. (Имейте в виду, что написание хороших #printOn: s - это минималистское искусство)

3 голосов
/ 20 января 2020

Переопределение printOn: будет работать для простых случаев, когда вы хотите просто изменить описание.
Pharo позволяет намного больше этого!
Из-за расширяемой (формуемой) природы нашего инспектора, вам не нужно переопределите метод, чтобы получить собственную визуализацию объекта.
Например, посмотрите эту визуализацию массива:

inspector

Это получается при добавлении этого метода на Collection:

gtInspectorItemsIn: composite
    <gtInspectorPresentationOrder: 0>

    ^ composite fastList
        title: 'Items';
        display: [ self asOrderedCollection ];
        beMultiple;
        format: [ :each | GTObjectPrinter asTruncatedTextFrom: each ];
        send: [ :result | 
            result
                ifNil: [ nil ]
                ifNotNil: [ result size = 1
                        ifTrue: [ result anyOne ]
                        ifFalse: [ self species withAll: result ]
                    ]
            ]

Если вы просмотрите отправителей gtInspectorPresentationOrder:, вы увидите, что на изображении уже есть много специальных визуализаций.
Вы можете взять их в качестве примера того, как создать свой, адаптированный именно к тому, что вам нужно:)

...