Рефакторинг далеко маркированных циклов

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

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    View mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_map);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapView = mapFragment.getView();
        mapFragment.getMapAsync(this);
            }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMyLocationEnabled(true);

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));

        if (mapView != null &&
                mapView.findViewById(Integer.parseInt("1")) != null) {
            // Get the button view
            View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
            // and next place it, on bottom right (as Google Maps app)
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
                    locationButton.getLayoutParams();
            // position on right bottom
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
            layoutParams.setMargins(0, 0, 30, 30);
        }

    }
}

И вот макет фрагмента: -

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.infogird.www.location_button_reposition.MapFragment">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</FrameLayout>

Надеюсь, это решит вашу проблему. Спасибо.

18
задан Community 23 May 2017 в 11:47
поделиться

12 ответов

Рассмотрение решений, представленных до сих пор:

  • они все выглядят менее читаемыми, чем оригинал, в этом они включают расходы большего количества кода механизма кода, а не на самом алгоритме

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

  • Некоторые идут с потерей производительности запущения того же теста дважды, который не может всегда быть тривиальным. Альтернатива этому хранит и передает по кругу булевские переменные, который становится ужасным.

  • Рефакторинг соответствующей части кода в метод эффективно нет: это перестраивает, как код размечается в файле, но не имеет никакого эффекта на то, как это выполняется.

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

34
ответ дан 30 November 2019 в 07:04
поделиться

Легко, мой хороший человек.

for( int idx = 0; idx < vectorLength; idx++) {
  if( conditionAtVectorPosition( v, idx ) ) continue;

  for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
    if( anotherConditionAtVector( v, rowIdx ) ) continue;
    if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) break;
  }
  if( !conditionAtMatrixRowCol( m, rowIdx, idx ) )
    setValueInVector( v, idx );
}

РЕДАКТИРОВАНИЕ: Довольно корректный Вы - Anders. Я отредактировал свое решение принять это во внимание также.

1
ответ дан 30 November 2019 в 07:04
поделиться

@Patrick Вы принимаете вызов setValueInVector (v, idx); в конце второго цикла в порядке. Если код должен быть идентичным, логически, он должен быть переписан к чему-то как это:

for( int idx = 0; idx 
1
ответ дан 30 November 2019 в 07:04
поделиться
Некоторые идут с потерей производительности запущения того же теста дважды, который не может всегда быть тривиальным. Альтернатива этому хранит и передает по кругу булевские переменные, который становится ужасным.
потеря производительности незначительна. Однако я соглашаюсь, что запущение теста дважды не является хорошим решением.

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

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

Однако делая тот же тест дважды не optimal— в теории.

РЕДАКТИРОВАНИЕ: На долгом размышлении примером является на самом деле не ужасное использование маркировок. Я соглашаюсь, что "goto нет - никакой" , но не из-за кода как это. Использование маркировок здесь на самом деле не влияет на удобочитаемость кода значительным способом. Конечно, они не требуются и могут легко быть опущены, но не использование их просто, потому что "использование маркирует, плохо", не хороший аргумент в этом случае. В конце концов, удаление маркировок не делает код намного легче читать, как уже прокомментировали другие.

1
ответ дан 30 November 2019 в 07:04
поделиться

Nicolas

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

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

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

то, Что делают все рефакторинги в этом потоке, эмулируют поведение маркировки, использующей другие функции языка - как будто Вы портировали код на язык, который не имел маркировок.

1
ответ дан 30 November 2019 в 07:04
поделиться

От чтения Вашего кода.

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

, Таким образом, можно сделать это:

  • Получают допустимые положения сначала с помощью conditionAtVectorPosition (это действительные столбцы).
  • Затем получают допустимые строки с помощью anotherConditionAtVector.
  • Наконец, используйте conditionAtMatrixRowCol использование действительных столбцов и строк.

я надеюсь, что это помогает.

1
ответ дан 30 November 2019 в 07:04
поделиться

Этот вопрос не был об оптимизации алгоритма - но спасибо так или иначе ;-)

В то время, когда я записал это, я полагал, что маркированные продолжаются как читаемое решение.

я спросил ТАК вопрос о конвенции (имеющий маркировку всеми заглавными буквами или не) для маркировок в Java.

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

До сих пор, я не полностью убежден альтернативами, представленными до сих пор.

не понимайте меня превратно. Маркировки являются злыми большую часть времени.

, Но в моем случае, условные тесты довольно просты, и алгоритм взят из математической статьи и поэтому очень вероятно не измениться в ближайшем будущем. Таким образом, я предпочитаю иметь все соответствующие части, видимые сразу вместо того, чтобы иметь необходимость прокрутить к другому методу, назвал что-то как checkMatrixAtRow (x).

Особенно в более сложных математических алгоритмах, мне довольно трудно найти "хорошие" имена функций - но я предполагаю, что это - еще один вопрос

1
ответ дан 30 November 2019 в 07:04
поделиться

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

<час>

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

то, Что я вообразил, было совсем другим блоком кода - подъем фактического примера, я вижу, что это намного более чисто, чем я думал.

Мои извинения за недоразумение.

1
ответ дан 30 November 2019 в 07:04
поделиться

Gishu имеет верное представление:

for( int idx = 0; idx < vectorLength; idx++) {
    if (!conditionAtVectorPosition( v, idx ) 
        && checkedRow(v, idx))
         setValueInVector( v, idx );
}

private boolean checkedRow(Vector v, int idx) {
    for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
        if( anotherConditionAtVector( v, rowIdx ) ) continue;
        if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) return false;
    }  
    return true;
}
0
ответ дан 30 November 2019 в 07:04
поделиться

Это работает на Вас? Я извлек внутренний цикл в метод CheckedEntireMatrix (можно назвать его лучше, чем я) - Также мой Java немного ржав.. но я думаю, что это получает сообщение через

for( int idx = 0; idx < vectorLength; idx++) {
    if( conditionAtVectorPosition( v, idx ) 
    || !CheckedEntireMatrix(v)) continue;

    setValueInVector( v, idx );
}

private bool CheckedEntireMatrix(Vector v)
{
    for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
        if( anotherConditionAtVector( v, rowIdx ) ) continue;
        if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) return false;
    }   
    return true;
}
0
ответ дан 30 November 2019 в 07:04
поделиться

Я не слишком уверен, чтобы понять, что первые продолжаются. Я скопировал бы Gishu и записал бы, что-то как (извините, если существуют некоторые ошибки):

for( int idx = 0; idx < vectorLength; idx++) {
    if( !conditionAtVectorPosition( v, idx ) && CheckedEntireMatrix(v))
        setValueInVector( v, idx );
}

inline bool CheckedEntireMatrix(Vector v) {
    for(rowIdx = 0; rowIdx < n; rowIdx++)
        if ( !anotherConditionAtVector(v,rowIdx) && conditionAtMatrixRowCol(m,rowIdx,idx) ) 
            return false;
    return true;
}
0
ответ дан 30 November 2019 в 07:04
поделиться

Sadie:

они все выглядят менее читаемыми, чем оригинал, в этом они включают расходы большего количества кода механизма кода, а не на самом алгоритме

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

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

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

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

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

Рефакторинг соответствующей части кода в метод эффективно нет: это перестраивает, как код размечается в файле, но не имеет никакого эффекта на то, как это выполняется.

я не вижу точку. Да, это не изменяет поведение, как... рефакторинг?

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

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

0
ответ дан 30 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

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