Правильно ли передать всю ответственность за клонирование объектов пользователю библиотеки? - PullRequest
2 голосов
/ 20 мая 2010

Я не настолько осведомлен в этом вопросе, поэтому я решил спросить здесь. Допустим, у нас есть какая-то «библиотека» в Ruby (или любой другой язык сценариев для передачи по ссылке):

class Moo
    attr_accessor :bar
    def initialize
        self
    end
end

a = 'a string'
b = Moo.new
b.bar = a

b.bar, очевидно, будет тем же объектом, что и a.

Правильно ли оставить все как есть в во всех случаях , поэтому программист, которому они нужны отдельно, будет выполнять клонирование вручную? Это единственная здравомыслящая идея, с которой я столкнулся.

1 Ответ

2 голосов
/ 20 мая 2010

Следуя принципу наименьшего удивления , правильно сохранить ссылку на назначенный объект, как вы сделали.

Если бы вы сделали внутренне dup объект, присвоенный bar, это было бы крайне разочарованием для потребителя вашей библиотеки, который хотел bar для обозначения идентичного объекта.

> class Moo
>  attr_accessor :bar
> end
=> nil
> a = 'a string'
=> "a string"
> b = Moo.new
=> #<Moo:0x2bfd238>
> b.bar = a
=> "a string"
> a.upcase!
=> "A STRING"
> b.bar # should be uppercase as expected since `a` was modified *in-place*
=> "A STRING"
> b.bar = a.dup # now modifications to `a` will not affect `bar`
=> "A STRING"
> a.downcase!
=> "a string"
> b.bar
=> "A STRING"

В качестве примечания: def initialize() self end совершенно не нужен, поскольку он идентичен стандартному initialize.

.
...