Язык на самом деле не определяет, как должна осуществляться базовая реализация. Это оставлено на усмотрение поставщика компилятора. Я сомневаюсь, что они используют структуру или запись. Любой ответ, который вы найдете, будет зависеть от поставщика, а не от языка. Стоит отметить, что наиболее распространенный компилятор, GNAT, является открытым исходным кодом, поэтому исходный код доступен для просмотра и попытки разобраться, как они это делают. Опять же, это только одна потенциальная реализация. Другие компиляторы могут делать это по-другому.
Если вы просто имеете в виду, как может выглядеть пример пакета:
empty my_package.ads:
package My_Package is
-- Empty package
end My_Package;
my_package.ads с типом типа «класс»:
package My_Package is
type My_Type is tagged private;
function Get_Value(Self : My_Type) return Integer;
private
type My_Type is tagged record
Value : Integer := 2;
end record;
end My_Package;
my_package.adb с определениями операций:
package body My_Package is
function Get_Value(Self : My_Type) return Integer is
begin
return Self.Value;
end Get_Value;
end My_Package;
Как видите, пакеты могут быть пустым Они могут иметь типы, операции или оба. Пакеты - это место, где обрабатывается инкапсуляция (в отличие от типа, подобного C ++ и Java). Таким образом, вы можете иметь частные типы и операции в пакете, но не заниматься традиционным объектно-ориентированным программированием.
Можно записать интерфейс обертки для вызовов времени/даты. Имейте одну реальную реализацию, которая делает реальные системные вызовы и тестовую реализацию, которая может сделать то, что Вы хотите (выполненный быстрее, медленнее, поддельные даты, и т.д.).
Если Вы - системные вызовы для получения системного времени (т.е. System.currentTimeMillis()
), по-видимому, можно ускорить время путем изменения системного времени. Это должно размышлять над временем, которое Вы видите в своем приложении.
Если Вы используете другие способы вычислить время (прошедшее время от JVM запускаются (т.е. System.nanoTime()
), сетевые серверы времени, и т.д....) затем ответ - то, что это не возможно.
Я не могу подчеркнуть достаточно, что я просто объясняю, как сделать то, что Вы спросили, и это хорошо только для интеграционного тестирования, когда Вы принимаете во внимание что-либо еще, на что Вы влияете на упомянутой машине.
Это не должно стать заменой вообще для надлежащего и обширного поблочного тестирования.
Один подход, который работает лучше всего на поблочное тестирование, должен абстрагировать способ, которым к текущему времени получают доступ в Вашем коде.
Вместо того, чтобы назвать System.currentTimeMillis () непосредственно можно обеспечить собственную реализацию.
Что-то вроде этого (псевдокод):
class MyTime {
private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();
public setTimeInterface(TimeInterface timeInterface) {
CurrentTimeInterface = timeInterface;
}
public int getTime() { CurrentTimeInterface.getTime(); }
}
class DefaultTimeImpl implements TimeInterface {
public int getTime() { return System.currentTimeMillis(); }
}
class TestTimeImpl implements TimeInterface {
private int CurrentTimeMillis = 0;
public int getTime() { return CurrentTimeMillis; }
public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
public void sleep(int millis) { CurrentTimeMillis += millis; }
}
Затем везде Вы звонили бы, System.getTimeMillis () вместо этого называют MyTime.getTime (). Когда Вы тестируете свой код, просто создают TestTimeImpl и называют MyTime.setTimeInterface(testTimeImpl). Затем, когда Вы хотите время к предварительному вызову testTimeImpl.sleep () или testTimeImpl.setTime ().
Это позволяет Вам моделировать любое время вниз к миллисекунде.
Необходимо разработать систему так, чтобы можно было 'перенести' часы во время тестирования. Для некоторых классов системы существует очередь событий, которая хранит запланированные события в порядке времени. В любой точке на моделировании следующее событие является первым объектом в очереди; можно вытянуть его от очереди и скорректировать полезное время так, чтобы это соответствовало времени, когда то событие имеет место. Поскольку новые события планируются, они добавляются к очереди. Таким образом можно обработать события так быстро, как система позволяет, вместо того, чтобы иметь необходимость ожидать в течение фактического времени для протекания. Но необходимо разработать систему, чтобы позволить такому механизму работать.