2012-02-13 2 views
1

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

class LEntity 

Недавно у меня был КОЛЛЕГА взрыв меня за бедный и " раздражающее "присвоение имен классам, которые затем переименовали каждый класс в рамки, которые я создал для людей, которые здесь используют.

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

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


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

+3

Поддерживает ли ваш язык пространство имен? –

+1

kNo kacto kit kis knot ka kbad kidea ka klot kof kframeworks kdo комплект. Csometimes Cthe Cprefixes Cmake Tmore Rsense Mthen LPCSTRothers –

+0

«Случайным символом или двумя», вы имеете в виду, что каждому классу присваивается случайный, другой? Если каждый имеет префикс по-разному, да, это очень плохая форма (невозможно просто узнать имя!). Если ваш язык поддерживает пространства имен, вы должны использовать это вместо этого. Если нет, THEN вы рассматриваете префикс с символами (многие, многие фреймворки делают это ... каждый из OSX (NS) для инструментальных средств GUI Linux, для Windows (не в .Net, а в фреймворках C/C++). – Kitsune

ответ

2

Учитывая, что ActionScript поддерживает пространства имен, нет причин использовать префиксы просто для предотвращения именования конфликтов. Для этого нужны пространства имен.

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

+0

В AS3 я знаю только, как использовать пространства имен для создания свойств или методов данного класса, доступных только из классов, которые используют требуемое пространство имен (как правило, они действуют как «внутренние», но без требования всех файлов, находящихся в одном пакете). – Marty

+0

Нет, вы не понимаете, как работают пространства имен и как они используются. Пространства имен не делают классы «доступными», это делается с помощью ключевых слов доступа (public, private и т. Д.). пространства имен делают идентификаторы * видимыми *, а не * доступными *. Когда вы делаете что-то вроде 'use namespace foo', это просто объединяет пространства имен, поэтому они находятся в одной области. Вы все равно можете использовать функции с именами, указав перед ним пространство имен ('foo :: myfunc()'). Это аналогичная цель заключается в добавлении символа в начало имен вашего класса, но более читабельна. –

1

Похоже, вы не совсем понимаете, какие пространства имен пакеты находятся в 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 
} 
+1

Разве это не пакет? Когда я думаю, что пространства имен в AS3 я думаю о фактическом использовании ключевого слова namespace: http://gskinner.com/blog/archives/2010/01/a_complete_guid.html – Marty

+0

Это, по-видимому, то, что, по-видимому, представляют собой пространства имен, но это не то, что они обычно используется для :) (если я не ошибаюсь) –

0

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

В 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(); 
+0

ОК, так что дайте мне повод, что мой подход раздражает в контексте того, кто использует мою библиотеку, имеющую свой собственный класс «Entity», но они также хотят расширить мой «LEntiy» 'класс. 'class Entity расширяет Entity'? Я так не думаю. Конечно, они могут просто переименовать свой класс Entity. Но что произойдет, если они используют * другую * библиотеку, у которой уже есть класс Entity? Чаще, чем можно было бы ожидать. – Marty

+0

Я не хотел вас огорчать, я заимствовал слово «раздражающее» от вашего коллеги просто потому, что префиксные имена классов в ActionScript 3 не нужны, и он просто не читается так хорошо. Если у вас должны быть все классы в корневой директории вашего проекта, то назвать класс просто Entity может быть проблемой. Однако, если вы организуете свои классы в пакетах, это позволит избежать столкновений имен, например: package com.yourdomain { import com.someoneelsesdomain.Entity; \t общественного класса Entity расширяет com.someoneelsesdomain.Entity { общественные функции Entity() { супер(); } } } – aeldron

Смежные вопросы