Pull to refresh

Legacy или Inheritance: немного оффтопа про .prototype, каламбур для неофита

Reading time 3 min
Views 3.9K
Постараюсь быть неимоверно кратким.

Написано для тех, кто только начинает!

Статей про наследование в JS не счесть:


Считаю важным добавить, что есть терминологическая разница на уровне языка носителей, т.е. — английского. И это принципиально важно, когда Вы работаете с прототипами в JS.

У меня в google по запросу "what is the difference between inheritance and legacy" первая ссылка ведёт сюда: ссылка.

Само собой, что статей там не одна.

Там есть такая строчка, дописка: Also, as pointed out in some comments, «inheritance» is generally from the viewpoint of the receiver, while «legacy» is from the viewpoint of the giver: My inheritance was my father's legacy.

Краткая суть, которая не отражает всей глубины, которую я себе уяснил, в том, что:
  • legacy — это взгляд со стороны родителя, широкий
  • inheritance — это взгляд со стороны потомка, узкий


Поэтому я считаю, что в обычных ООП языках программирования типа Java, C#, С++ и т.п. используется термин inheritance — наследование.

А у нас в JavaScript используется почти то же самое, но немного шире: legacy — наследство.

А т.к. в Русском Языке разницы между этими понятиями почти нет, то отсюда и масса FuckUp'ов с пониманием зачем это нужно.

И, в том числе потому, что от Legacy code мы никуда не денемся.

UPD 2: Выжимка из статьи про legacy code >> Modern interpretations.

… source code inherited from someone else and source code inherited from an older version of the software…

UPD 3: Под катом идёт речь о том, что Inheritance неминуемо влечёт за собой Legacy. Точней наоборот, согласно терминологии носителей языка Legacy — это больше чем Inheritance.

UPD 1: В комментариях подсказывают, что может быть частично речь идёт о Гипотезе Сепира-Уорфа. Спасибо k12th. Так же спасибо lair за конструктивную критику.


Вот код из Node.JS REPL> console.log(util.inherits.toString())
function (ctor, superCtor) {
	ctor.super_ = superCtor;
	ctor.prototype = Object.create(superCtor.prototype, {
		constructor: {
			value: ctor,
			enumerable: false,
			writable: true,
			configurable: true
		}
	});
}

(если кому интересно, разглядывал через это средство, используйте осторожно, т.к. я — автор)


Вот обычный код, который обычно используют:
function inherit(Child, Parent) {
	var BlankClass = function () {};
	BlankClass.prototype = Parent.prototype;
	Child.prototype = new BlankClass();
	Child.prototype.constructor = Child;
	Child.prototype.superclass = Parent;
};


Тот же код, но с сайта javascript.ru,
Тот же код, но с сайта javascript.ru
function extend(Child, Parent) {
	var F = function() { };
	F.prototype = Parent.prototype;
	Child.prototype = new F();
	Child.prototype.constructor = Child;
	Child.superclass = Parent.prototype;
};


javascript.ru/tutorial/object/inheritance

Обратите внимание, используется термин Inheritance!

Да, и, тут, наверное важно прояснить позицию, т.к. я ЗА такой подход, за оба подхода. Но, как и все мы, я против legacy code в широком смысле. Но от этого никуда не деться.

В итоге, мы, как правило, делаем так:

var SomeChild = function () {};

var SomeParent = function () {};

inherit (SomeChild, SomeParent);

SomeChild.prototype.overload_something = 'something_we_need_to_FuckUp';


В результате чего, собственно, и реализуется «наследование с перегрузкой методов».

Проблем здесь, вроде бы, нет, потому, что все к этому привыкли. Это «стандартная» реализация, и от неё «никуда». Она базируется на Inheritance парадигме.

Но, при чём здесь legacy?

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

Это мантра.

И вроде бы про это про всё везде написано, и всем новичкам это объясняют.

Но этого мало, потому, что:

>> Legacy, as it relates to inheritance, will be of broader or deeper scope. When inheritance refers to one generation's gifts to another, a legacy would refer to three or four generations. >>

То есть, вот, ни для кого не новость, что есть prototype chain.

Но как её использовать, и почему всё «так», может быть не совсем понятно даже не новичку.

Поэтому прошу, учитывайте, что между legacy и inheritance есть разница. И что для носителей языка она ещё более очевидна, чем для нас, не носителей. Просто почему-то новичкам часто кажется, что её почти нет, так себе — синонимы.

И, наконец, самое, на мой взгляд, важное, то, что не дописано в UPD 3:
Термин Legacy включает в себя термин Inheritance, как у них, так и у нас. Разница мне стала понятна не так давно. И, в следующий раз когда я соберусь написать .prototype, я вспомню, что такой подход неминуемо исходит из наличия Legacy. Поэтому я 7 раз подумаю, могу ли я без него обойтись. Может мне будет достаточно других средств языка, чтобы написать эти пару строк сорца. И, если уж мне придётся всё таки это использовать, то «набрасывая» код очередного Child, я буду помнить, что для Parent — это Legacy.
Only registered users can participate in poll. Log in, please.
Есть разница?
32.14% да, есть разница 9
3.57% нет разницы 1
25% мне — без разницы 7
35.71% всем без разницы 10
3.57% напишу в комментариях 1
28 users voted. 29 users abstained.
Tags:
Hubs:
0
Comments 26
Comments Comments 26

Articles