В OOPS у нас есть понятие, называемое инкапсуляция , которое означает, , что внутреннее представление объекта обычно скрыто от взгляда вне определения объекта. Только сам объект может возиться со своим внутренним состоянием. Внешний мир не может.
Каждый объект обычно определяется его состоянием и поведением , в ruby переменные экземпляра называются внутренним состоянием или состоянием объекта, и согласно OOPS состояние не должно быть доступно любому другому объекту и выполнению поэтому мы придерживаемся инкапсуляции.
ex: class Foo
def initialize(bar)
@bar = bar
end
end
Выше мы определили класс Foo и в методе initialize мы инициализировали переменную экземпляра (атрибут) или (свойство). когда мы создаем новый объект ruby, используя новый метод, который, в свою очередь, вызывает метод инициализации внутри, когда метод запускается, переменная экземпляра @bar объявляется и инициализируется, и она будет сохранена как состояние объекта.
Каждая переменная экземпляра имеет свое собственное внутреннее состояние и уникальна для самого объекта, каждый метод, который мы определяем в классе, будет изменять внутреннее состояние объекта в соответствии с определением и целью метода. здесь метод initialize делает то же самое, например, создает новую переменную экземпляра.
var object = Foo.new(1)
#<Foo:0x00000001910cc0 @bar=1>
В фоновом режиме ruby создал переменную экземпляра (@bar = 1) и сохранил значение как состояние объекта внутри объекта «объект». мы можем проверить это с помощью метода instance_variables, и эти методы возвращают массив, содержащий все переменные экземпляра объекта в соответствии с текущим состоянием объекта.
object.instance_variables
#[
[0]: @bar
]
мы можем видеть переменную экземпляра '@bar' выше. который создается, когда мы вызываем метод initialize объекта. эта переменная @bar не должна быть видимой (скрытой) по умолчанию, и поэтому ее не могут видеть другие снаружи объекта, кроме объекта, изнутри. Но объект может возиться со своим собственным внутренним состоянием, и это означает, что он может показать или изменить значения, если мы дадим ему способ сделать это, эти два можно сделать, создав новые методы экземпляра в классе.
когда мы хотим увидеть переменную @bar, вызвав ее, мы получаем ошибку, так как по умолчанию мы не можем видеть состояние объекта.
show = object.bar
#NoMethodError: undefined method `bar' for #<Foo:0x00000001910cc0 @bar=1>
#from (irb):24
#from /home/.rvm/rubies/ruby-2.0.0-p648/bin/irb:12:in `<main>'
Но мы можем получить доступ к переменным двумя методами, эти два называются методами setter и getter , которые позволяют объекту отображать или изменять свое внутреннее состояние (переменные экземпляра / атрибуты / свойства) соответственно.
class Foo
def bar
@bar
end
def bar=(new_bar)
@bar = new_bar
end
end
Мы определили методы getter (bar) и setter (bar =), мы можем назвать их любым способом, но переменная экземпляра внутри должна совпадать с переменной экземпляра, которой мы хотим показать или изменить значение. сеттеры и геттеры в некотором смысле являются нарушением концепций OOPS, но они также являются очень мощными методами.
Когда мы определяем два метода путем повторного открытия класса и определения их, когда мы вызываем объект с помощью методов, мы можем иметь возможность просматривать переменные экземпляра (здесь @foo) и также изменять его значение.
object.bar
1
object.bar=2
2
object.bar
2
Здесь мы вызвали метод bar (getter), который возвращает значение @bar, а затем мы назвали bar = метод (setter), который мы указали в качестве аргумента new_value, и он изменил значение переменной экземпляра ( @bar) и мы можем посмотреть его снова, вызвав метод bar.
В ruby у нас есть метод с именем attr_accessor , который объединяет как методы-установщики, так и методы-получатели, мы определяем его выше определений методов внутри класса. Методы attr_ * являются ярлыком для создания методов (setter и getter)
class Foo
attr_accessor :bar
end
мы должны предоставить символ (: bar) в качестве аргумента метода attr_accessor, который создает методы как setter, так и getter внутренне с именами методов как указано имя символа.
Если нам нужен только метод получения, мы можем вызвать attr_reader: bar. Если нам нужен только метод установки, мы можем вызвать attr_writer: bar
attr_accessor создает методы как attr_writer, так и attr_reader
мы можем предоставить столько переменных экземпляра, сколько мы хотим, методам attr_ *, разделенным запятыми
class Foo
attr_writer :bar
attr_reader :bar
attr_accessor :bar, :baz
end
Для платформы Windows вы можете использовать время безотказной работы .
C:\>uptime
\\SPOCK has been up for: 2 day(s), 0 hour(s), 45 minute(s), 34 second(s)
Вы должны иметь возможность находить события в журнале событий, такие как запуск службы журнала событий, которая сообщит вам, перезагружен ли компьютер.
Вот как читать журнал событий на C #: http://msdn.microsoft.com/en-us/library/k6b9a7h8%28VS.71%29.aspx
// C#
foreach (System.Diagnostics.EventLogEntry entry in EventLog1.Entries)
{
Console.WriteLine(entry.Message);
}
Примечание: вы должны указать язык и ОС, которые вы используете.
Если вы используете .NET, вы можете использовать для этого Environment.TickCount . Это дает вам количество мс с момента запуска системы. Обратите внимание, что он обновляется каждые ~ 24 дня, поэтому вам придется компенсировать это (если вам не все равно).
Не могли бы вы просто вести счетчик количества событий, выполненных вашим приложением. А затем остановиться, когда счетчик достигнет порога? Если ваше приложение содержит службу, то ее можно встроить как часть службы, которая будет перезапущена с сеансами Windows. Я подозреваю, что именно так работал SMTP-сервер, по крайней мере, это самый простой способ реализовать что-то подобное. Это заставило бы большинство начинающих / промежуточных системных администраторов перезагружать компьютер, а умные, вероятно, в любом случае заслуживают бесплатное программное обеспечение.