2010-05-21 7 views
5

Его долгое время не было запрограммировано на C++, но я знаю, что на C++ классы организованы в файлы .h и .cpp. Также многие другие языки извлекают выгоду из разделения кода на логические группы в структуре каталогов для улучшения организации.Лучший способ организовать интерфейс Go

Ну, я пытаюсь научиться Идите сейчас, и я читал статью Go for C++ Programmers, когда сталкивался с интерфейсами. В статье объясняется, что интерфейсы в Go существенно заменяют классы и показывают, как их настроить довольно хорошо.

Что я пытаюсь выяснить, так это как мне организовать интерфейс в файлы? Например, должен ли интерфейс находиться в одном файле, а реализация - в другом?

myInterface.go

type myInterface interface { 
    get() int 
    set(i int) 
} 


myImplementation.go

type myType struct { i int } 
func (p *myType) set(i int) { p.i = i } 
func (p *myType) get() int { return p.i } 

Мой код здесь может быть неправильным, так как я не совсем знаю, что я делаю, пока (и если я неправ, пожалуйста, поправьте меня), но будет ли это лучшим способом установить это? Мне очень тяжело, пытаясь обернуть голову, как организовать код в Go, поэтому любая помощь приветствуется!

Метрополис

+0

Я очень поздно в шоу. Но я обычно придерживаюсь стиля исходного кода: https://golang.org/src –

ответ

5

Нет необходимости вводить типы и интерфейсы в отдельные файлы. Товары, которые экспортируются из каждого пакета , являются важными, и вы обозначаете их, начиная имя с большой буквы. In C & co. что входит в файл заголовка, потому что это вещь «импортирована» (включена). В Go это импортируемый пакет, и неважно, как его содержимое организовано в разные исходные файлы (оно не будет видимым для импортера).

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

+0

Большое спасибо за информацию Arkku. Причина, по которой я задаю этот вопрос, состоит в том, что я очень волнуюсь, что Go собирается превратиться в праздничный праздник. Я не хочу иметь 20 функций на странице, потому что я думаю, что с этим было бы трудно справиться. Но, с другой стороны, может быть, Go просто будет запрограммирован больше? – Metropolis

+0

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

+0

Наверное, мне действительно следовало переформулировать мой вопрос. Не могли бы вы дать мне какую-то структуру файлов Go, которая организована, чтобы я мог видеть, как файлы могут взаимодействовать друг с другом? Все, что я видел из приведенных примеров, является основным функционалом и множеством других функций в одном файле, которые обращаются друг к другу. Это здорово для примеров, но в более организованной среде я думаю, что это было бы плохо. – Metropolis

6

Язык программирования Go не C++, и не является C. Подойдите к нему, как новый язык. Go не имеет эквивалента заголовкам. У этого есть только свободная связь с концепцией классов C++. Поскольку вы не являетесь экспертным программистом на C++, не обращайте внимания на статью Go For C++ Programmers.

Начать чтение A Tutorial for the Go Programming Language. Затем прочитайте Effective Go. Просмотрите The Go Programming Language Specification, чтобы вы знали, где искать вещи.

Go с открытым исходным кодом, поэтому посмотрите на настоящие Go package documentation и source code.

Для начала просмотрите пакет timedocumentation и source code, который был написан авторами Go. Они не используют отдельные файлы для деклараций и реализаций интерфейса, так почему вы хотите? Как вы сами говорите, вы еще не знаете, что делаете, так почему бы не начать, следуя примеру, заданному экспертами?

Некоторая мотивация для разработки языка программирования Go возникла из желания создать язык, который был лучше C и намного проще, чем C++. Принимая во внимание процедурные характеристики (часто подобные C) Go, полезны процедурные концепции проектирования, такие как сцепление и сцепление. Эти концепции очевидны при разбиении пакета Go time на несколько исходных файлов. Некоторые концепции дизайна классов также будут полезны, но помните, что Go не поддерживает наследование.

Как отметил Никлаус Вирт в своей классической статье «Разработка программ поэтапным уточнением», ранние черновики программы редко бывают идеальными, возможно, даже небрежными. Даже финальная версия редко бывает идеальной. Например, авторы Go, спустя всего несколько месяцев, недавно переписали пакет Go json.

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

Программы Go построены путем связывания вместе пакетов. Пакет, в своей очереди строятся из одного или нескольких источников файлов, которые вместе декларировать константы, типов, переменные и функции , относящиеся к пакету и которые доступны во всех файлах одного и тот же пакета. Этими элементами могут быть , экспортированные и используемые в другом пакете. Packages, The Go Programming Language Specification.

Что нужно сделать для первого пакета Go? Задайте конкретные вопросы, на которые можно ответить, и укажите подробности.

+0

Я не говорил, что это C++ или C ..... Я знаю, что он не имеет равнозначного заголовочным файлам, я также знаю, что это свободная связь с концепциями C++ ... Мой вопрос: «Каков наилучший способ организации интерфейсов/кода в Go» – Metropolis

+0

Я просто использовал заголовочные файлы C++ как что-то, чтобы сравнить его с тем, как статья об этом сравнении. – Metropolis

+0

Спасибо за дополнительную информацию peter, которая помогла. Думаю, мне просто нужно найти какой-то способ перейти от моего ориентированного на объект (класса) мышления к чему-то другому, и я очень переживаю, что он выйдет неряшливо. Я ненавижу писать неряшливый код .... как я уверен, многие из нас делают ... – Metropolis

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