Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   помогите новичку! (https://javascript.ru/forum/node-js-io-js/83576-pomogite-novichku.html)

fxobject 15.01.2022 19:05

помогите новичку!
 
есть описание класса - ну очень уж большое.
как можно его покоцать по файлам?
class popandos{
function1(){} // в этом файле
function2(){} // в другом файле
}
причем нужно понимать что this у них при использовании един, и
возможны перекрестные вызовы....
можно конечно require. Но если за this можно уследить
то перекрестные вызовы членов класса - капец полный.
I need a help !!!

ksa 15.01.2022 21:26

Цитата:

Сообщение от fxobject
как можно его покоцать по файлам?

Да хоть бы вот так...
const test = require('./test')

class Tmp {
	
	constructor(name) {
		this.name = name
		this.test = test
	}
	home() {
		console.log(this.name)
	}
}

const o = new Tmp('Вася')
o.home()
o.test()

test.js
function test() {
	console.log(this.name)
}

module.exports = test

fxobject 15.01.2022 22:18

направление понятно
экспорт из test.js нужно делать не функцию, а структуру в которой ключам соответствуют функции (по причине того, что в файле test.js) может находится большее количество функций). Экспортировать их поименно и затем поименно присваивать все функции в конструкторе не совсем хорошая идея.
таким образом - каждый файл экспортирует все свои функции посредством структуры. Основной файл в конструкторе их присваивает внутри класса. При использовании при таком варианте немного изменится вызов. Он будет осуществляться не через this а this.test.func
Ну и ладно. В принципе перекрестные вызовы (если таких файлов несколько и нужно сделать вызов из test.js в test1.js) тоже могут быть осуществлены через this.
Остается еще один вопрос:
Этот класс родительский многим объектам. Там от sql до работы по нестандартным протоколам (много чего). Но все подобные модули собранные в этом классе реализованы в режиме возможной "одновременной работы". Т.е. при наличии незаконченного выполненного одного действия допускаются повторные вызовы.
При создании конечного объекта создаются множество других объектов всяких сокетов, sqэлев, телнетов и прочее. Конечный объект востребован каждый раз как поступает входящий запрос на некую операцию. Запросов таких много и поступают они асинхронно. Чтобы на каждый такой запрос не создавать монструальноый new - конечный класс создается как global.Myclass = new ....
Т.е. - один объект и его this глобальный.
Чтобы при таком подходе отделять данные разных запросов в точках входа обработки запроса создется new структура, она вначале может быть проинициализирована в зависимости от запроса и собственно она дальше и является this для всей цепочки работы. Передается она в виде первого параметра. Ну а this нигде не используется.
Так вот вопрос - можно ли каким то образом сделать эту структуру полноценным this. т.е. перенести в нее функционал класса (из prototype) и везде дальше обращаться к данным через this, С учетом того что объект глобальный и вызовы асинхронные
Спасибо

ksa 15.01.2022 22:25

Цитата:

Сообщение от fxobject
Экспортировать их поименно и затем поименно присваивать все функции в конструкторе не совсем хорошая идея.

Это называется пример. :D

Цитата:

Сообщение от fxobject
Этот класс родительский многим объектам.

Всегда предупреждали не делать "швейцарский нож"...

Цитата:

Сообщение от fxobject
можно ли каким то образом сделать эту структуру полноценным this. т.е. перенести в нее функционал класса (из prototype) и везде дальше обращаться к данным через this, С учетом того что объект глобальный и вызовы асинхронные

Прочитав твое пространное описание, можно так же пространно утверждать - если вы все сделаете правильно, таки да, это сделать можно. :D

Т.е. если у вас такое не будет получаться - значит что-то вы таки делали не правильно. :nono: :D

fxobject 15.01.2022 22:33

Цитата:

Сообщение от ksa (Сообщение 543023)
Это называется пример. :D
Всегда предупреждали не делать "швейцарский нож"...

Ну то, что Вы не сторонник ООП(проектирования) - это понятно
Цитата:

Сообщение от ksa (Сообщение 543023)
Прочитав твое пространное описание, можно так же пространно утверждать.......

Это просто вникать не хочется, называется - харит )))

ksa 15.01.2022 22:34

Цитата:

Сообщение от fxobject
экспорт из test.js нужно делать не функцию, а структуру в которой ключам соответствуют функции (по причине того, что в файле test.js) может находится большее количество функций).

У этого так же есть побочный эффект...
const Def = require('./test')

class Tmp {
	constructor(name) {
		this.name = name
		this.fn = Def
		this.fn.test = this.fn.test.bind(this)
	}
	home() {
		console.log(this.name)
	}
}

const o = new Tmp('Вася')
o.home()
o.fn.test()

test.js
const Def = {
	test: function (){
		console.log(this.name)
	}
}

module.exports = Def

fxobject 15.01.2022 22:36

про побочный эффект я написал при постановке вопроса. невнимательно читали. Закрываем тему. разберусь сам.

ksa 15.01.2022 22:37

Цитата:

Сообщение от fxobject
Ну то, что Вы не сторонник ООП(проектирования) - это понятно

Я сторонник простого и понятного. :D

Цитата:

Сообщение от fxobject
Это просто вникать не хочется, называется - харит )))

Твои проблемы - это только твои проблемы...
Я тут собираю проблемы таких как ты дабы потом так не делать и своим ребятам так делать не давать. ;)
Т.ч. и от таких как ты есть польза в работе.
Цитата:

Сообщение от fxobject
Закрываем тему. разберусь сам.

Удачи!

fxobject 15.01.2022 22:39

понятно, - СЭНСЭЙ.
бедные ребята

ksa 15.01.2022 22:40

Цитата:

Сообщение от fxobject
бедные ребята

Ты спец - тебе видней... :D

MallSerg 16.01.2022 03:50

Кто то пытается переизобрести фабрики производящие классы объектов по необходимым параметрам и запросам.

Может поможет гугление в сторону "паттерн фабрика js"?

voraa 16.01.2022 09:14

Совсем "по правилам" надо так добавлять
test.js
const methods = {
	function test() {
		console.log(this.name)
	}
} 

module.exports = methods


const methods = require('./test')
 
class Tmp {
     
    constructor(name) {
        //....
    }
    home() {
        //...
    }
}
 methods.__proto__ = Tmp.prototype.__proto__
Object.defineProperty(Tmp.prototype, 'test', {
            writable: true,
            enumerable: false,
            configurable: true,
            value: methods.test,
        });

fxobject 16.01.2022 10:13

Для тех, кто может столкнуться с подобным вопросом:
Если погуглить задачу разбиения большого файла node.js на куски то все решения будут подобны предложенному варианту пана Проффэсора. Данный вариант технически работает, но эстетически дискомфортен и неприемлем. И большой массив инициализировать можно присваивая каждому элементу значение построчно. Теоретически - тоже работает. Ситуацию усугубляет тот факт, что JS не имеет множественного наследования. Поэтому получилось два варианта решения.
Первый вариант:
Разбиваем класс как вам удобно. Выносим функции во внешние файлы и связываем из последовательно цепочкой при помощи наследования proto
например:
test1.js
class myClass{
	   function2(){}
	   function1(){}
	}
	module.exports = myClass;

test2.js
const test1 = require('./test1.js');
	class myClass{
	    __proto__: test1
	   function3(){}
	   function4(){}
	}
	module.exports = myClass;

main.js
const test2 = require('./test2.js');
	class myClass{
	    __proto__: test2
	   function5(){}
	   function6(){}
	}

Обратите внимание, что во всех файлах имя класса остается такое же как у класса в основном файле.
Тот же самый вариант получился если бы мы задействовали extends:
test1.js
class myClass{
	   function2(){}
	   function1(){}
	}
	module.exports = myClass;

main.js
const test1 = require('./test1.js');
	class myClass extends test1{
	   constructor(){
	      super(  );   // -- здесь обязательно вызывается конструктор дочернего объекта
	   }
	   function5(){}
	   function6(){}
	}

В этом варианте единственный недостаток - последовательная цепочка разбивки может быть логически несостоятельна.
Например функции работы с смс сообщениями будут наследовать класс работы с консолью линукс машины и т.д.
Поэтому для меня данный метод тоже не подошел. Есть второй вариант - использовать примеси.
Причем есть задумка делать подключение блоков функции "по требованию".
Если же класс функционально однороден - то первый метод найболее подходит. Надеюсь кому то может пригодиться.
Спасибо

рони 16.01.2022 11:38

fxobject,


Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.


Часовой пояс GMT +3, время: 19:40.