Могут ли экземпляры объектов знать текущее состояние друг друга? - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть 3 объекта:

  • Parser
  • ParserState - конечный автомат, который отслеживает текущее состояние и переходы между состояниями
  • ParserDefinitions - он читает из файла json и предоставляет регулярные выражения заданного состояния, а также некоторые другие правила, управляющие работой синтаксического анализатора

ParserState и ParserDefinitions являются подклассами (?) Parser и определяются как Parser :: ParserState и Parser :: ParserDefinitions. Было бы здорово, если бы объект ParserState мог иметь доступ к текущему экземпляру ParserDefinitions и наоборот. Возможно ли это, или это означает, что они должны быть объединены в один класс?

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

1 Ответ

1 голос
/ 01 апреля 2011
  1. Это не подклассы, они просто расположены под именем класса. Это не обеспечивает связи между объектами класса.

  2. Способ, которым объект A получает доступ к состоянию объекта B, заключается в вызове методов для объекта B и просмотре возвращаемых значений. Кажется, что единственная проблема здесь заключается в том, как сделать объект A известным об объекте B.

  3. Вы называете их названия прописными буквами, как если бы они были модулями или классами, но вы, похоже, называете их экземплярами. Являются ли эти одноэлементные объекты или (например) экземпляр Parser создает экземпляры ParserStart и ParserDefinitions? Предполагая, что последний случай:

    class Parser
      attr_accessor :states, :defns
      def initialize
        self.states = ParserStates.new( self )
        self.defns  = ParserDefinitions.new( self )
      end
    end
    
    class Parser::ParserStates
      attr_accessor :parser
      def initialize( parent_parser )
        self.parser = parent_parser
      end
      def defns
        parser.defns
      end
    end
    
    class Parser::ParserDefinitions
      attr_accessor :parser
      def initialize( parent_parser )
        self.parser = parent_parser
      end
      def states
        parser.states
      end
    end
    

    Учитывая вышеизложенное, когда каждый «дочерний» объект знает о своем «родителе» и родительский объект предоставляет доступ к дочерним элементам, все объекты могут общаться друг с другом.

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