Куда понятие Интерфейсов прибывало из?

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

Однако, если вы хотите, чтобы это работало во время разработки при запуске приложения Flask при отладке, посмотрите на этот gist .

Флажок DispatcherMiddleware для спасения!

Я скопирую код здесь для потомков:

"Serve a Flask app on a sub-url during localhost development."

from flask import Flask


APPLICATION_ROOT = '/spam'


app = Flask(__name__)
app.config.from_object(__name__)  # I think this adds APPLICATION_ROOT
                                  # to the config - I'm not exactly sure how!
# alternatively:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT


@app.route('/')
def index():
    return 'Hello, world!'


if __name__ == '__main__':
    # Relevant documents:
    # http://werkzeug.pocoo.org/docs/middlewares/
    # http://flask.pocoo.org/docs/patterns/appdispatch/
    from werkzeug.serving import run_simple
    from werkzeug.wsgi import DispatcherMiddleware
    app.config['DEBUG'] = True
    # Load a dummy app at the root URL to give 404 errors.
    # Serve app at APPLICATION_ROOT for localhost development.
    application = DispatcherMiddleware(Flask('dummy_app'), {
        app.config['APPLICATION_ROOT']: app,
    })
    run_simple('localhost', 5000, application, use_reloader=True)

Теперь при запуске вышеуказанного кода в качестве автономного приложения Flask , http://localhost:5000/spam/ отобразит Hello, world!.

В комментарии к другому ответу я сказал, что хотел сделать что-то вроде этого:

from flask import Flask, Blueprint

# Let's pretend module_blueprint defines a route, '/record//'
from some_submodule.flask import module_blueprint

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
app.run()

# I now would like to be able to get to my route via this url:
# http://host:8080/api/some_submodule/record/1/

Применение DispatcherMiddleware к мой надуманный пример:

from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware

# Let's pretend module_blueprint defines a route, '/record//'
from some_submodule.flask import module_blueprint

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
application = DispatcherMiddleware(Flask('dummy_app'), {
    app.config['APPLICATION_ROOT']: app
})
run_simple('localhost', 5000, application, use_reloader=True)

# Now, this url works!
# http://host:8080/api/some_submodule/record/1/

10
задан Max Galkin 21 February 2010 в 12:51
поделиться

18 ответов

Интерфейсы довольно стары, и были вокруг долгое время.

Рано (середина к последнему в конце 1970-х) необъектно-ориентированные языки, такие как Modula и Euclid использовали конструкции, названные "модулями" для определения интерфейсов между компонентами. Компоненты затем общались бы друг с другом через явный импорт и экспорт модулей. Интерфейсы в C# являются объектно-ориентированными эволюциями того же самого понятия.

Интерфейсы в C# непосредственно расширяются от понятия интерфейсов в C++ (и Java), где они использовались в качестве части COM для описания объектно-ориентированных интерфейсов компонента.

Править: В выполнении небольшого количества исследования самый ранний язык, который я мог найти с явным "интерфейсным" ключевым словом, был Modula-3, derivitive Modula, созданного приблизительно в 1986.

10
ответ дан 3 December 2019 в 22:03
поделиться

Это - просто другой слой абстракции. Едва ли уверенный, куда это прибыло из.. Я все еще часто слышу их названный контрактами, а не интерфейсами.

-4
ответ дан 3 December 2019 в 22:03
поделиться

Я думаю, что основная идея является "множественным наследованием". Таким образом, идея прибыла из C++.

-5
ответ дан 3 December 2019 в 22:03
поделиться
-3
ответ дан 3 December 2019 в 22:03
поделиться

Интерфейсы также использовались в CORBA. Язык определения интерфейсов (IDL) использовался для описания интерфейсов независимо от любого языка, в котором был реализован объект. Это разделило не только интерфейс и реализацию, но также и интерфейсную и привязку к языку.

0
ответ дан 3 December 2019 в 22:03
поделиться

В то время как не названный 'интерфейсами', C указатели структуры данных с указателями функции, поскольку элементы структуры реализовали понятие интерфейсов задолго до того, как C++ сделал с виртуальными базовыми классами IMO.

0
ответ дан 3 December 2019 в 22:03
поделиться

Интерфейсы прибыли из информатики. Или, скажем, от здравого смысла в программировании. Интерфейс является логической группой методов класса. C++ не было нужно отдельное понятие языка "интерфейса", потому что любой класс мог бы использоваться в качестве интерфейса - просто определяют ряд методов в нем, не делают реализации, называют его как IExecutable и использование:

class IExecutable
{
public:
    virtual void Execute() = 0;
};

class MyClass : public IExecutable
{
public:
    void Execute() { return; };
};

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

C# ясно разделяет понятие интерфейсов от классов, потому что он использует статический контроль типов..., и множественное наследование запрещается на том языке, но для класса нормально иметь один базовый класс и другой интерфейс, или реализовывать несколько интерфейсов за один раз.

public interface IPurring
{
    void Purr();
}

public class Cat : Animal, IPurring
{
    public Cat(bool _isAlive)
    {
        isAlive = _isAlive;
    }

    #region IPurring Members

    public void Purr()
    {
        //implement purring
    }

    #endregion
}
0
ответ дан 3 December 2019 в 22:03
поделиться

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

class IFoo
{
public:
  void Bar() =0;
  void Bar2() =0;
};

class Concrete : public IFoo
{
public:
  void Bar() { ... }
  void Bar2() { ... }
}
0
ответ дан 3 December 2019 в 22:03
поделиться

В C++ у Вас мог быть абстрактный класс без реализации, и Вы могли наследовать несколько классов. Java и C# избавились от множественного наследования, поэтому чтобы иметь способность наследовать несколько контрактов (не поведения), они создали интерфейсы. Можно только наследовать один класс в C#, но можно наследовать столько интерфейсов, сколько Вы хотите.

Интерфейсом является JST контракт. Это говорит, какие участники, которых должен реализовать экземпляр. Это делает это, однако, не реализовывая поведений по умолчанию.

0
ответ дан 3 December 2019 в 22:03
поделиться

Они существовали в C++, но они были известны как виртуальные базовые классы, которые состояли только из чистых виртуальных функций. Это - то, куда префикс "I-" для интерфейсов прибыл из - для дифференциации между виртуальными базовыми классами от абстрактных базовых классов.

1
ответ дан 3 December 2019 в 22:03
поделиться

Я интерфейсы trink прибыли из того, что некоторые программисты устали от записи реализации метода много раз. Сколько раз может Вы писать:

static string Method(int i)

не думая должен быть более легкий путь?

1
ответ дан 3 December 2019 в 22:03
поделиться

Самая ранняя реализация интерфейсов, о которых я знаю в вычислениях, прибыла из CORBA.

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

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

1
ответ дан 3 December 2019 в 22:03
поделиться

я видел, что ключевое слово взаимодействует через интерфейс сначала в Java, но они значительно старше, чем это.

то же понятие существует в C++, но это не точно то же. Их называют "чистыми виртуальными классами"

http://en.wikipedia.org/wiki/Virtual_function

Они существуют с другим синтаксисом, но там для разрешения полиморфизма в ООП.

1
ответ дан 3 December 2019 в 22:03
поделиться

C++ допускает множественное наследование. Когда Java был разработан, единичное наследование было решено однако классы, были позволены реализовать несколько интерфейсов. C# продвинул это понятие.

1
ответ дан 3 December 2019 в 22:03
поделиться

Интерфейсы существовали в C++, если Вы сделали программирование COM, которое является, где конвенция IPrefix происходит.

Хотя сам C++ исходно не поддерживал интерфейсы, COM/C ++ используемые библиотеки типов, сгенерированные с Языка определения интерфейсов, который имеет единственную цель определить интерфейсы и использовал интерфейсное ключевое слово задолго до Java, или C# сделал.

Кроме разрешения формы нескольких наследование, мотивация.NET для интерфейсов имеет отношение к своим ориентированным на компонент источникам, и ее основная цель состоит в том, чтобы определить контракты между компонентами, которые могут взаимодействовать без любого ведома реализаций друг друга. Некоторые взаимодействующие с COM также сделаны с интерфейсами.NET.

2
ответ дан 3 December 2019 в 22:03
поделиться

У меня создалось впечатление, что первое формализованное понятие интерфейсов прибыло из Objective C (названный "протоколами"). Я могу сказать Вам наверняка, что Java, по крайней мере, получил идею от Objective C, таким образом, это не был Java, который имел интерфейсы сначала.

Электронная почта от Patrick Naughton

3
ответ дан 3 December 2019 в 22:03
поделиться

Они произошли из Java, и они были представлены, потому что Java (и C#) не позволяет множественное наследование.

Править: Я получаю некоторый downmods, потому что люди, использующие COM-интерфейсы в C++, не соглашаются с вышеупомянутым оператором. Независимо, понятие интерфейса прибыло из Java, COM-интерфейсы C++ были виртуальными классами, Java был первым языком, который сделает это функцией языка.

РЕДАКТИРОВАНИЕ КОНЦА

Например, в C++, у Вас мог быть класс под названием Собака, которая наследовалась Животному и Млекопитающему.

В C# Вы имели бы базовый класс под названием Животное и использовали бы интерфейс (IMammal). Я, называющий нотацию, является историческим от C++ (Это использовалось для указания на абстрактный виртуальный класс), и был перенесен на Java, но более значительный в C#, потому что нет никакого простого способа сказать то, что является базовым классом и что является интерфейсом из объявления класса C#:

public class Dog : Animal, IMammal

в то время как в Java это было более очевидно:

public class Dog extends Animal implements IMammal

Множественное наследование очень хитро, таким образом, интерфейсы были получены для упрощения его. Класс C# может только наследоваться одному базовому классу, но может реализовать сумму N интерфейсов.

В C++ интерфейсы могут быть моделированы при помощи чистых виртуальных классов. Они требуют, чтобы все методы были переопределены полиморфно наследующим классом.

3
ответ дан 3 December 2019 в 22:03
поделиться

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

5
ответ дан 3 December 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: