Come si chiama quando definisci delle costanti che si riferiscono semplicemente a uno spazio dei nomi di grandi dimensioni? [chiuso]

6

Sto usando JRuby.

Ho molte classi implementate in Java, e voglio creare degli oggetti fuori di esse nei miei script Ruby.

Supponiamo che io abbia una classe Sprite in Java. In Ruby, per fare riferimento ad esso, io uso il seguente:

Java::ComMyWebsiteMyProjectName::Sprite

Perché Sprite è definito nel pacchetto com.myWebsite.myProjectName .

Ora, per semplificare le cose, mi piace farlo:

Sprite = Java::ComMyWebsiteMyProjectName::Sprite

Che imposta la costante Sprite sulla classe Sprite definita in Java. Ora il mio codice Ruby può farvi riferimento semplicemente scrivendo Sprite .

Ho un file pieno di quel tipo di dichiarazioni. Qualcosa come:

Sprite   = Java::ComMyWebsiteMyProjectName::Sprite
Texture  = Java::ComMyWebsiteMyProjectName::Texture
Bitmap   = Java::ComMyWebsiteMyProjectName::Bitmap
Math     = Java::ComMyWebsiteMyProjectName::Math
Geometry = Java::ComMyWebsiteMyProjectName::Geometry

Ora, non conosco molto bene i concetti di programmazione. Sto avendo problemi a dare un nome a questo file, perché non so nemmeno se esiste un nome per questo genere di cose. Questo tipo di "pratica" ha un nome effettivo?

    
posta Omega 20.11.2013 - 11:45
fonte

3 risposte

7

Generalmente, questo genere di cose si chiama Type Aliasing . Quando lo fai specificatamente per uno spazio dei nomi, stai importando lo spazio dei nomi (o, più precisamente, importando i tipi all'interno dello spazio dei nomi).

    
risposta data 20.11.2013 - 14:42
fonte
6

Questo è noto con molti nomi diversi e probabilmente chiamato ancora di più. E a volte quello che pensi è il tipo di aliasing in una lingua è qualcosa di completamente diverso in un'altra.

In Perl, hai il codice che assomiglia a:

#!/usr/bin/perl

package Foo::Bar::Qux::Bletch;
$var = 42;

package main;
print $Foo::Bar::Qux::Bletch::var, "\n";
*A = *Foo::Bar::Qux::Bletch::var;
print $A,"\n";

Che è noto da varie cose come un alias typeglob o solo alias di glob - anche se dovrebbe essere realizzato che a glob è un'altra cosa.

In Clojure, questo è semplicemente un alias:

user=> (require 'clojure.string)
nil

user=> (alias 'string 'clojure.string)
nil

user=> (string/capitalize "hONdURas")
"Honduras"

In Ruby sembra avere il nome dell'alias dello spazio dei nomi come descritto in ruby-forum: Namespace anche looooooong

However it occurred to me that there is a difference between namespace aliases in PHP and the closest thing in Ruby (as described above): Autoloading.

In PHP, questo è di nuovo, un alias del namespace - php.net: Uso degli spazi dei nomi: Alias / Importazione

The ability to refer to an external fully qualified name with an alias, or importing, is an important feature of namespaces. This is similar to the ability of unix-based filesystems to create symbolic links to a file or to a directory.

PHP namespaces support three kinds of aliasing or importing: aliasing a class name, aliasing an interface name, and aliasing a namespace name. Note that importing a function or constant is not supported.

In Lisp, questo non fa parte del linguaggio standard ma ci sono librerie che lo fanno e si chiamano 'alias locale del pacchetto' o 'nickname'. Una di queste librerie è cl-package-alias che fornisce alcune funzionalità aggiuntive:

* (defpackage :foo (:use :cl) (:alias (:common-lisp :bar)))

# <PACKAGE "FOO">
* (in-package :foo)

# <PACKAGE "FOO">
* (bar:format t "Hello World~%")
Hello World
NIL

In python, questo è un alias di namespace. (Esempi da Puoi definire alias per i moduli importati in Python? )

import a_ridiculously_long_module_name as short_name

Anche se puoi farlo anche con un assalto

import long_module_name
lmn = long_module_name

In C # questo è un alias dello spazio dei nomi.

Da Java equivalente a C # usando alias

namespace TheirNamespace
{
    public class ContestedClassName
    {
    }
}

namespace MyNamespace
{
    public class ContestedClassName
    {
    }
}

namespace MyBoundaryNamespace
{
    using MyRenamedClass = MyNamespace.ContestedClassName;
    using TheirRenamedClass = TheirNamespace.ContestedClassName;

    public class Translator
    {
        public TheirRenamedClass Translate(MyRenamedClass value)
        {
            return null;
        }
    }
}

In Java, uno non sostituisce alias un namespace, ma importa elementi specifici nello spazio dei nomi corrente, anche se risponde alla domanda posta (come ridurre la quantità di battitura):

Il codice

double r = cos(Math.PI * theta);

può essere ridotto con un'importazione statica in:

import static java.lang.Math.PI;
...
double r = cos(PI * theta);

Uno spesso vede questo utilizzo con Junit per evitare di dover specificare ogni metodo statico.

import static org.junit.Assert.*;

Quando le persone parlano di tipo aliasing in Java è più lungo le linee di:

A problem I often encounter in Java is that I want to say “these two things are the same”, but Java won’t let me. Suppose I want to maintain an int[] array which is always sorted in my program.

che ottiene più dell'alias tipo piuttosto che dell'alias namespace , perché sono cose diverse.

Il tipo di aliasing in Scala sembra essere qualcosa di completamente diverso in base a Principiante : Alias tipo Scala in Scala 2.10? e Alias tipo Scala incluso companion opporsi

Ulteriori informazioni su quale tipo di aliasing in Scala è disponibile all'indirizzo Scala efficace

In C ++ 11 tipo alias sono un tipo di typedef che fa più cose altro di giocoleria namespace.

using identifier = type_name;   

Un esempio di questo sarebbe:

// type alias, identical to
// typedef void (*func)(int, int);
using func = void (*) (int,int);
// the name 'func' now denotes a pointer to function:
void example(int, int) {}
func fn = example;

Pur comprendendo, ci sono alcune differenze tra questi concetti come descritti in Differenza tra alias typedef e C ++ 11

La riproduzione di namespace tuttavia, è un alias di namespace come descritto in In C ++, cos'è un" alias namespace "?

namespace ublas = boost::numeric::ublas;

ublas::vector<double> v;

Maggiori informazioni su questo alias dello spazio dei nomi msdn

namespace a_very_long_namespace_name { ... }
namespace AVLNN = a_very_long_namespace_name;
// AVLNN is now a namespace-alias for a_very_long_namespace_name.

Il link mostra alcune lingue con varie forme di alias dello spazio dei nomi.

OCaml:

module Gr = Graphics;;

Haskell:

import qualified Data.Bytestring as B

Gli spazi dei nomi non sono unici per i linguaggi di programmazione, ma si estendono anche ad altri dati strutturati come XSL che ha alias di namespace. Questi tendono ad essere trasformazioni piuttosto concise (convertendo 'alt' in 'xsl' o qualcosa di simile - ma servono allo stesso scopo.

Quindi, come notato, questi concetti hanno nomi diversi in diverse lingue e ciò che è noto come "type aliasing" in una lingua può significare qualcosa completamente diverso in un'altra lingua.

Non esiste un nome standard

    
risposta data 23.11.2013 - 17:37
fonte
0

Questo di solito è chiamato "binding". Ad esempio, ci sono molti moduli node.js che sono solo collegamenti con le librerie C ++. O librerie Python che forniscono collegamenti per il codice C. E probabilmente ci sono alcune librerie JRuby che forniscono collegamenti per il codice Java.

    
risposta data 20.11.2013 - 14:46
fonte

Leggi altre domande sui tag