Плохо ли добавлять префиксы ко всем именам классов фреймворка? - PullRequest
1 голос
/ 13 февраля 2012

Я разрабатываю множество фреймворков для флеш игр и приложений.Я всегда начинал с префикса в именах своих классов случайным или двумя символами, чтобы избежать конфликта с именами классов, которые могут быть у разработчика, например:

class LEntity

Недавно у меня был сотрудник, обвиняющий меня в бедностии «раздражающее» наименование классов, которые затем переименовали каждый класс в рамках, которые я создал для использования здесь людьми.

У меня возникают проблемы с достаточно подробным объяснением моих рассуждений дляон принимает то, что я сделал, как хороший подход.

Является ли то, что я сделал выше, на самом деле плохо?Если нет, как я могу объяснить иначе?Если да, то почему?


В комментариях спрашивается о пространствах имен - я знаю, что AS3 в этом примере имеет то, что, как я знаю, называется пространством имен, но я не уверен, является ли это тем же или нетможно использовать как положено.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Учитывая, что Actionscript поддерживает пространства имен, нет никаких оснований использовать префиксы просто для предотвращения конфликтов имен. Вот для чего нужны пространства имен.

Некоторым людям нравится использовать пространства имен для значимых переменных-членов (т. Е. Префикса подчеркивания или иногда m_), и это имеет некоторые преимущества, но просто ради коллизии имен no.

1 голос
/ 13 февраля 2012

Похоже, вы не совсем понимаете, что такое пространства имен пакетов в AS3.

Пример:

//Class1.as
package com.test.someModule { //This is the package/namespace
  public class Class1 {...}
}

//Class2.as
package com.test.otherModule {
  import com.test.someModule.Class1; //Class1 can be used as "Class1" now. Otherwise you would do "com.test.someModule.Class1"
  import com.test.someModule.*; //You can also use the "*" to "import" all classes in that package
}
0 голосов
/ 10 мая 2012

Я должен согласиться с вашим коллегой, ваши имена классов «раздражают».

В ActionScript 3 мы используем имя пакета для определения пространства имен класса. Если вы не уверены, что означает пространство имен, примите определение из Википедии (на момент написания):

"В общем, пространство имен - это контейнер для набора идентификаторов (имена), и позволяет устранять неоднозначность идентификаторов омонимов, постоянно проживающих в разных пространствах имен. "

Таким образом, вы никогда не будете "конфликтовать с именами классов", если вы правильно называете свои пакеты. Большинство разработчиков используют так называемую обратную доменную нотацию для именования своих пакетов (например, com.mywebsite.MyGenericNamedClass). Доменные имена уникальны, поэтому маловероятно, что вы столкнетесь с другим классом.

Как правило, имя класса должно быть как можно более описательным, поэтому некоторые имена ваших классов будут такими же, как и у класса другого. Возьмите класс Sprite по умолчанию, например:

import flash.display.Sprite;
import uk.co.mywebsite.Sprite;

если вы затем инициализируете объект:

var mySprite:Sprite = new Sprite();

Компилятор не будет знать, какой Sprite вы хотите инициализировать (это флэш-спрайт или ваш собственный пользовательский спрайт), и он выдаст ошибку.

Решение простое: поскольку ваши пакеты были названы правильно, все, что вам нужно сделать, это использовать полное имя класса, включая имя пакета, для инициализации вашего объекта:

var mySprite:uk.co.mywebsite.Sprite = new uk.co.mywebsite.Sprite();
var myOtherSprite:flash.display.Sprite = new flash.display.Sprite();

Имейте в виду, вам редко придется это делать. Это необходимо только в том случае, если вы хотите использовать эти два класса (Sprite по умолчанию и ваш собственный Sprite) в одной области видимости. Обычно вы импортируете только свой собственный класс:

/* we are not importing this any more 
  import flash.display.Sprite;*/

//only importing my own class
import uk.co.mywebsite.Sprite;

/* now I can initialize my object without using the full class name, and the compiler knows 
I mean my own Sprite class */
var mySprite:Sprite = new Sprite();
...