Показать сообщение отдельно
  #5 (permalink)  
Старый 17.09.2016, 19:05
Новичок на форуме
Отправить личное сообщение для Gudsaf Посмотреть профиль Найти все сообщения от Gudsaf
 
Регистрация: 16.09.2009
Сообщений: 3

Сообщение от warren buffet Посмотреть сообщение
Зачем тебе функция как метод, если она фактически constructor?
Проблема немного в другом.
Я пытаюсь освоить ООП в JS на боевом примере, и хочется сделать красиво, но не очень выходит.

Я проектирую два (по сути как) класса:
- график (GraphStruct)
- кривая (CurveStruct)

График имеет свои свойства и методы:
function GraphStruct(distCrvs, maxCurveLength, maxCurveHeight, ..., jsonData){

		this.mainNumOfPnts = calcAveregeNum(jsonData);
		this.numberOfCurves = jsonData.lessons.length;
		this.distanceBtwCurves = distCrvs;
		this.maxWidth = maxCurveLength;
		this.maxHeight = maxCurveHeight;
		this.denstyKfcnt = denstyKfcnt;
		this.roundKfcnt = roundKfcnt;
		this.ratBasToTechKfcnt = ratBasToTechKfcnt;
		this.graphObjects = {
			curves: [],
			axisAndGrids: undefined,
			relationships: undefined
		};

		// рассчитываем параметры всех точек графика исходя из настроек графика
		this.calcCurvesParam = function (Data) {

			var arr = [];
			// пробегаем все кривые  описанные в JSON, шлём параметры графика через this
			for(var i= 0; Data.lessons[i]; i++){
				this.graphObjects.curves.push(new CurveStruct( i, Data.lessons[i]));
			}
			return arr;
		};

		function calcAveregeNum (jsonData){
			...
		}

		...
	}

Кривая имеет свои свойства и методы:
function CurveStruct(curveNumber, jsonLesson) {

		if ( this.__proto__ != graph ) { 
			inherit(graph, this); } //наследовать свойства графика в кривую

		this.curveNumber = curveNumber;
		this.numberOfPoints = jsonLesson.test_results.length;
		this.midPointNumber = calcMidPoint(this.numberOfPoints);
		this.position_x = calcPosX(this);
		this.curveObjects = {
			lines: [],
			planes: [],
			points: []
		};
		
		// куча методов которые используют значения свойств
		// объекта graph, то есть: 
		// - mainNumOfPnts
		// - distanceBtwCurves
		// - denstyKfcnt
		// - и др...
		// 
		// я хочу их вызывать в конструкторе кривых и его методах
		// просто и изящно, на подобие этого (кстати так и вызываю сейчас): 
		function calcPosX (curve) {
			var crvNumber = curve.curveNumber;
			var crvAll = curve.numberOfCurves;
			var midCurve = Math.floor(crvAll/2);
			return curve.distanceBtwCurves * (crvNumber - midCurve));
		}

	}

Как видите, чтобы в методах кривой я мог использовать свойства графика просто и красиво, я делаю прототипное наследование: указываю прототипом кривой объект графика. У меня получается использовать свойства графика только тогда, когда:
  1. объект графика инициализирован

Когда он не инициализирован, я получаю в значениях наследуемых параметров undefined

Логика в том, что по приходу JSON'а я хочу тупо вызовом конструктора графика, сразу же выстроить и сам график и заодно все кривые, которые строятся своим конструктором (данные для графика и кривых лежат в самом JSON). Но сейчас я сначала делаю объект графика, а потом уже рассчитываю все кривые, потому что если вызвать конструктор кривой во время процесса инициализации объекта графика - будет наследование undefined значений. То есть выглядит это так:
var graph = new GraphStruct(40, 800, 350, 1, 0.82, 9/10, dataInput); // создал график graph
		graph.calcCurvesParam(dataInput); // вызвал конструктор кривых и создал кривые в графике graph


А в идеале хотелось бы так:
var graph = new GraphStruct(40, 800, 350, 1, 0.82, 9/10, dataInput);
		// без вызова calcCurvesParam(dataInput)


Соответственно вызов конструктора кривой перенести в конструктор графика, как-то так:
function GraphStruct(distCrvs, maxCurveLength, maxCurveHeight, ..., jsonData){

		this.mainNumOfPnts = calcAveregeNum(jsonData);
		this.numberOfCurves = jsonData.lessons.length;
		this.distanceBtwCurves = distCrvs;
		this.maxWidth = maxCurveLength;
		this.maxHeight = maxCurveHeight;
		this.denstyKfcnt = denstyKfcnt;
		this.roundKfcnt = roundKfcnt;
		this.ratBasToTechKfcnt = ratBasToTechKfcnt;
		this.graphObjects = {
			

			// СДЕЛАТЬ КАК-ТО ТАК:
			curves: calcCurvesParam(),


			axisAndGrids: undefined,
			relationships: undefined
		};


		// соответственно функцию закрыть и не публиковать
		function calcCurvesParam () {

			var arr = [];

			// пробегаем по все кривым  описанным в JSON
			for(var i= 0; Data.lessons[i]; i++){
				arr.push(new CurveStruct( i, Data.lessons[i]));
			}
			return arr;
		}
		
		...
	}


Опыта мало, а колхоз хочется разводить по-меньше)

Возможно есть ошибка в архитектуре и это делается всё проще, если есть такой вариант, расскажите пожалуйста

Последний раз редактировалось Gudsaf, 17.09.2016 в 19:09.
Ответить с цитированием